2012-03-22 5 views
0

私はファイル〜1.5GBを持っています 私はこのファイルで30億のシーケンスを見つける必要があります。 1つのシーケンスは4または5バイトです。 最初の位置を見つけるか、ファイル内のそのようなシーケンス番号を確認してください。 最速の方法は?検索大きいファイルの4-5バイトシーケンス

コンピュータ上のRAMの制限 - 4ギガバイト

+0

何よりも早くですか? – blueshift

+0

シナリオをさらに展開することはできますか?約15億バイトの30億個のシーケンスはおそらく巨大な重なりを持っています。あなたはそれらの配列の位置を見つける必要がありますか?あるいは単にそれらが全く存在するかどうか? – deceze

+0

最初のポジションを見つける – turbanoff

答えて

1

使用grep。それは、大容量のファイルで物事を見つけるために高度に最適化されています。
これはオプションではない場合は、Boyer-Moore algorithmについて読んで、それを使用して自分で実装してください。同じ速度を再現するには多くの調整が必要ですgrepがあります。

+0

30億回の独立した実行、非常に高速なアルゴリズムでさえ遅い。 – turbanoff

+0

あなたはそれを30億回実行する必要があると誰が言ったのですか? 'grep'は論理ORクエリをサポートする正規表現をサポートしています。たとえ30億語のORをとることが困難であっても、少なくともそれをチャンクすることができます。 – deceze

0

前処理を使用してください。

Indexを作成して、ファイルを実行して、すべてのユニークな4バイトシーケンスの最初のインスタンスを記録する必要があると思います。バイトシーケンスでソートされた異なるファイルに4バイトシーケンスと最初に発生した位置を格納します。

インデックスファイルで簡単なバイナリ検索を使用すると、効率的にシーケンスを見つけることができます。

O(1)に検索を減らすために、より賢明でハッシュを使用できます。

+0

シーケンスは5バイトであってもよい。この場合、4バイトシーケンスの最初の位置では不十分です。 – turbanoff

+0

インデックスのサイズはいくらですか? – turbanoff

+0

これは、あなたの4-5バイトのシーケンスが何度繰り返されるかによって決まります...繰り返しが高いほど、インデックスのサイズは小さくなります。最悪の場合(すべてのシーケンスが存在する場合)、255^5(〜4228250625)(長さ5のバイトのすべての組み合わせ)。 – st0le

0

Searchlight検索エンジンをチェックしてください。

このプログラムでは、最大10個のASCIIバイトの複数のシーケンスを1つのファイルに格納できます。ファイル、ディレクトリ、ファイル名のファイル、ディレクトリ名のファイル、ファイル名のarraylist、またはディレクトリ名のarraylistを指定すると、それは消え去ります!

さらに、検出された各シーケンスのファイルバイト位置/オフセットを報告します。

関連する問題