まず、マシンのメモリは関係ありません。関連するのは、プロセスのアドレス空間のサイズです。32 ビットの Python では、これは 4GB 未満になります。64 ビットの Python では、これで十分です。
この理由は、ファイルを物理メモリにマッピングすることでmmap
はなく、仮想メモリにマッピングすることです。ped ファイルは、プログラムの特別なスワップ ファイルのようになります。これについて考えると少し複雑になる可能性がありますが、上記のウィキペディアのリンクが役立つはずです。mmap
したがって、最初の答えは「64 ビットの Python を使用する」です。しかし、明らかにそれはあなたの場合には当てはまらないかもしれません。
明らかな代替手段は、最初の 1GB にマップし、それを検索し、マップを解除し、次の 1GB にマップする、などです。これを行う方法は、メソッドにパラメータlength
とoffset
パラメータを指定することmmap
です。例えば:
m = mmap.mmap(f.fileno(), length=1024*1024*1024, offset=1536*1024*1024)
ただし、探している正規表現は、最初の 1 GB の半分と 2 番目の半分で見つかる可能性があります。したがって、ウィンドウ処理を使用する必要があります。つまり、最初の 1 GB でマップし、検索してマップ解除し、部分的に重複する 1 GB でマップする、などです。
問題は、どのくらいのオーバーラップが必要かということです。一致の最大可能サイズがわかっている場合は、それ以上のものは必要ありません。わからない場合は、正規表現を分割せずに問題を実際に解決する方法はありません。それが明らかでない場合は、単一の 1 GB ウィンドウで 2 GB の一致を見つける方法を想像してみてください。
フォローアップの質問に答える:
バッファを10MBに設定したので、性能的には10MBのファイルをmmapしたのと同じですか?
他のパフォーマンスの問題と同様に、本当に重要な場合はテストする必要があります。そうでない場合は、心配する必要はありません。
あなたが私に推測してもらいたい場合:私はmmap
ここでより速いかもしれないと思いますが、(JF Sebastianが暗示したように)ループしてre.match
128K回呼び出すと、コードがIOバウンドではなくCPUバウンドになる可能性があるためです。mmap
ただし、を使用するだけで、を使用せずに最適化できますread
。それで、mmap
より速いでしょうread
か?mmap
関連するサイズを考えると、 のパフォーマンスは、古い Unix プラットフォームでははるかに速く、最新の Unix プラットフォームではほぼ同じで、Windows では少し遅くなると思います。(を使用している場合でも、 mmap
overread
またはread
+から大きなパフォーマンス上の利点を得ることができますが、ここでは関係ありません。) しかし、実際には、それは単なる推測です。lseek
madvise
使用する最も説得力のある理由mmap
は、通常、read
ベースのコードよりも単純であり、高速だからではありません。でさえウィンドウ操作を使用するmmap
必要があり、 でシークを行う必要がない場合read
、これはそれほど魅力的ではありませんが、それでも、両方の方法でコードを記述しようとすると、mmap
コードが少し終わると思いますより読みやすく。(特に、明白なread
解決策からバッファ コピーを最適化しようとした場合)。