サイズが 20 GB の大きなテキスト ファイルがあります。このファイルには、比較的短いテキスト行が含まれています (1 行あたり 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 にロードし (一意性を確保するため)、ファイルから 128 MB のチャンクを読み取り、string::find を使用して文字列を検索します (別の 128 MB のチャンクを読み取ることからやり直します)。これは機能し、約 4 日で完了します。読み取り境界が検索対象の文字列を壊す可能性については心配していません。もしそうなら、それはOKです。
もっと速くしたいです。1 日で検索を完了するのが理想的ですが、パフォーマンスが大幅に向上するのは素晴らしいことです。他のライブラリを避けながら、(必要に応じて) Boost を備えた標準 C++ を使用することを好みます。
だから私は2つの質問があります:
- 私が使用しているツールとタスクを考慮すると、4 日間の時間は合理的に思えますか?
- より速くするための最良のアプローチは何ですか?
ありがとう。
編集: Trie ソリューションを使用して、実行時間を 27 時間に短縮することができました。1日以内ではありませんが、確実に今でははるかに高速です。アドバイスをありがとう。