問題の説明は漠然としていて、いくつかの異なる方法で読むことができます。
私がこれを読む1つの方法は、ディスク上のデータ構造のある種のASCII表現があるということです。この表現をメモリに読み込んでから、1回以上grepして、特定の正規表現に一致するものを探します。
これを高速化することは、問題のデータ構造に大きく依存します。
単に行分割を行っている場合は、単一の読み取り命令を使用して、すべてをバイト配列に読み取る必要があります。次に、複数行にまたがらないバイト配列grepを使用するようにgrepの方法を変更できます。^.*?
最初と.*?$
最後に置くことで常に行全体に一致するように式をいじる場合(?
最大のムンクではなく最小のムンクを強制します)、一致した式のサイズをチェックして、何バイト先に進むかを調べることができます。
または、モジュールを使用して、mmap
何も読み取らずにコピーのオーバーヘッドが発生することなく、同様のことを実現することもできます。
データ構造を作成するために多くの処理が行われていて、ファイル内のデータを単純なバイト配列として非常に生の方法で使用する方法を考えることができない場合は、他のさまざまな解決策が残されていますそれに応じて、これらの中でデーモンを作成することが最良のオプションのように聞こえます。
基本的な操作は「どのテーブルエントリがregexpに一致するかを教えてください」のように見えるので、xmlrpc.server
andxmlrpc.client
ライブラリを使用して、正規表現を文字列として受け取り、自然な形式で結果を返す呼び出しを単純にまとめることができます。ライブラリは、関数呼び出しのように見えるものをソケットなどを介してメッセージにまとめるすべての作業を処理します。
さて、実際にそれをメモリに保持するというあなたの考えは、少し厄介です。最近はディスクから2Gの情報を読み取るのに30分もかからないと思います。最大で5、おそらく1未満かかる可能性があります。したがって、データ構造をどのように構築しているかを調べて、代わりにそれを最適化できるかどうかを確認することをお勧めします。
ピクルスやマーシャルが購入するのは、シリアル化された形式からデータ構造を構築するための高度に最適化されたコードです。これにより、データ構造の作成が、代わりにディスクの読み取り速度によって制約される可能性があります。つまり、対処している本当の問題は、毎回ディスクから読み取るのではなく、独自のアドレス空間にデータ構造を構築することです。
そして、それをメモリに保持してデーモンを使用することは、それがメモリにとどまるという保証ではありません。Pythonプロセスのアドレス空間内で必要なデータ構造として構築されたままであることを保証するだけです。OSは、いつでもそのメモリをディスクにスワップすることを決定できます。
繰り返しになりますが、これは、ディスクから読み取る時間に焦点を合わせることが適切な焦点ではない可能性が高いことを意味します。代わりに、Pythonプロセスのアドレス空間でデータ構造を効率的に再作成(または保存)する方法に焦点を当てます。
とにかく、それはこのトピックに関する私の長年の散歩です。あなたの質問の曖昧さを考えると、明確な答えはありません、それで私はただ可能な技術といくつかの指針となるアイデアのスモーガスボードを与えました。