テキストファイル内の文字列を見つける最も速い方法は何ですか?ケースシナリオ:約50000のファイルパスがリストされたテキストファイル内の特定のパスを検索します(各パスには独自の行があります)。テキストファイルの部分文字列を見つける最も速い方法
0
A
答えて
2
このサイズのファイルはメモリに簡単に収まらなければならず、アイテムとしてパスを使ってstd :: set(またはそれを手に入れたライブラリがあればさらに良いハッシュセット)にすることができます。正確なパスがあるかどうかを確認すると、非常に高速になります。
サブパスも検索する必要がある場合は、ソートされたstd :: vector(接頭辞のみを探している場合)が唯一便利な方法かもしれません。完全に一般的な部分文字列とにかくすべてのベクトルをスキャンする必要がありますが、それをしなければならない限り、何百倍もの悪影響はありません。
0
これは正規表現のフィールドです。あなたはgrepとawkを調べるべきです。
2
ファイル内で文字列を1回、複数のファイルで同じ文字列を繰り返し、同じファイル内に複数の文字列を見つける必要はありますか?
シナリオによっては、いくつかの可能な回答があります。あなたはBoyer-Mooreのようなアルゴリズムを使用して同じファイルに
をいくつかの文字列を検索する必要がある場合(アレックスによって提案されたセットのような)データstuctureを構築
は便利です、あなたが検索している場合は効率的です1つの文字列
複数の文字列を検索する必要がある場合は、正規表現エンジンを使用することをお勧めします。
0
検索を使用したい範囲はわかりませんが、FSMは使用するのに適したオプションです。ここで
は議論です:Short example of regular expression converted to a state machine?
関連する問題
- 1. Mongodbのフィールドに部分文字列を見つける方法
- 2. アルファベット順に最長の部分文字列を見つける
- 3. 既存の文字列のすべての部分文字列を決定する最も速い方法
- 4. 接尾辞ツリー(バイナリ文字列):最も長い部分文字列を見つけよう
- 5. 文字列の部分文字列の範囲を見つける
- 6. 可能なすべての部分文字列を見つける方法
- 7. iOSで@ symbolを含む部分文字列を見つける方法
- 8. 文字列の最後の文字列を見つける方法
- 9. UILabelで部分文字列の座標を見つける
- 10. LINQを使用して文字列のリスト内の部分文字列を見つける方法
- 11. 一致する部分文字列を見つける
- 12. LINQを使用して文字列[]内で最も長い文字列を見つける方法
- 13. Pythonの文字列から複数の部分文字列を見つける方法
- 14. ファジーマッチで文字列内の部分文字列の位置を見つける方法
- 15. 文字列コレクション内で最も同一の文字列を見つける
- 16. MySQL - 部分文字列を見つける - フルテキスト?
- 17. PyMongoで部分文字列を見つける
- 18. UNIXでファイル内の文字列を見つけるための速い方法
- 19. 他の文字列内の最大類似部分文字列を見つける
- 20. SQLで部分文字列を検索する最速の方法は?
- 21. Cでn文字の文字列を作成する最も速い方法
- 22. 文字列内で部分文字列が最初に出現する位置を見つける
- 23. 大きな文字列ファイル(Python)で部分文字列一致を見つける最も効率的な方法
- 24. unixの2つの文字列の最も長い共通部分文字列を見つけるためのシェルコマンドは何ですか?
- 25. バッチファイル - テキストファイル内のスペースの後の文字列を見つける
- 26. NSStringの部分文字列のすべての場所を見つける(最初だけではない)
- 27. NxN行列のすべての部分行列を反復する最善の方法/最も速い方法
- 28. 部分文字列による文字列コレクションの高速フィルタリング?
- 29. bashだけで文字列内の部分文字列を見つけるためのマッチの使用
- 30. 大きなSQLデータベースの長いテキスト文字列の完全一致を見つける最速の方法
私はこれが最速の方法であることを疑う - 最も簡単な。特定のパスが検索された場合、最速の方法は、各行を読み取って検索されたパスと比較し、一致が見つかるとすぐに中止することです。他のすべてはオーバーヘッドです。それ以外にstd :: hash_setは通常std :: setよりはるかに高速です。 –
あなたがライブラリを手元に持っているなら、私はハッシュセットをお勧めしました。ライブラリが使用する標準違反の 'std:'プレフィックスにもかかわらず、C++標準ではないことを忘れないでください。 1つのgulpで数百KBのディスクを読むことは、I/OとCPUの作業をミックスするより経験的に高速です(FS、ディスクキャッシュ、先読みなどのマルチタスクシステムでは少なくともディスクI/Oのコストリニア読み取り(100KB <1msec)よりもはるかにシークが多く、コンテキストの切り替えが可能になり、シークが発生しやすくなります(他のプロセスはディスクのどこかで見えるため)。 –
私は時間がかかり、ベンチマークサンプルを書いた。あなたは間違っています:80000行の5MBファイルを読み込むには、読み込んだ行ごとにstrcmpを含む良いマシンで約0.60秒かかります。 strcmpを省略してstd :: setをビルドすると、ランタイムは0.75秒に増えます。 –