我有一个大小为20 GB的大文本文件。该文件包含相对较短的文本行(每行40到60个字符)。该文件未排序。
我有一个包含20,000个唯一字符串的列表。我想知道每个字符串在文件中每次出现的偏移量。目前,我的输出如下:
netloader.cc found at offset: 46350917
netloader.cc found at offset: 48138591
netloader.cc found at offset: 50012089
netloader.cc found at offset: 51622874
netloader.cc found at offset: 52588949
...
360doc.com found at offset: 26411474
360doc.com found at offset: 26411508
360doc.com found at offset: 26483662
360doc.com found at offset: 26582000
我正在将20,000个字符串加载到std :: set中(以确保唯一性),然后从文件中读取128MB块,并使用string :: find搜索字符串(通过读取另一个128MB块重新开始)。 这个方法可以工作并在大约4天内完成。 我不担心读取边界可能会破坏我正在搜索的字符串。 如果发生这种情况,没关系。
我想让它更快。 在1天内完成搜索是理想的,但任何显着的性能改进都很好。 我喜欢使用标准C ++和Boost(如果必要),同时避免其他库。
所以我有两个问题:
1.考虑到我正在使用的工具和任务,4天时间是否合理?
2.使其更快的最佳方法是什么?
谢谢。
编辑:使用Trie解决方案,我能够将运行时间缩短到27小时。虽然没有在一天之内完成,但现在速度快多了。 感谢您的建议。
bufferedData.find(searchStrings[i])
,这仍然涉及搜索大量数据,因为它将搜索每个块20,000次。 - SlxS