2

後で使用するためにPython(またはC ++)データをRAMに保存することは可能ですか?これはどのように実現できますか?

背景: 入力テーブルのどの行が指定された正規表現に一致するかを見つけるプログラムを作成しました。約1秒以内にすべての行を見つけることができます。ただし、問題は、このプログラムを起動するたびに、入力テーブルをPythonオブジェクトに処理することです。このプロセスには約30分かかります。

このプログラムは、最終的に128GBを超えるRAMを搭載したマシンで実行されます。Pythonオブジェクトは約2GBのRAMを使用します。入力テーブルはめったに変更されないため、Pythonオブジェクト(現在毎回再計算しています)は実際にはめったに変更されません。このPythonオブジェクトを一度作成し、24時間年中無休でRAMに保存し(入力テーブルが変更されたりサーバーが再起動した場合に再作成)、必要に応じて毎回使用する方法はありますか?

注:Pythonオブジェクトは、作成後に変更されません。ただし、必要に応じてこのオブジェクトを再作成できる必要があります。

編集:私が考えることができる唯一の解決策は、プログラムを24時間年中無休で(デーモンとして??)実行し続け、必要に応じてコマンドを発行することです。

4

4 に答える 4

2

RAMに何かを保存するには、実行中のプロセスが必要です。したがって、最も簡単な解決策は、編集で書いたものを実装することです。また、常に実行される新しいプロセスを作成し、古いプロセスを新しいプロセスに接続してデータを取得することもできます。接続方法はあなた次第です。共有メモリまたはTCP/IPソケットを使用できます。TCP / IPには、データにネットワークアクセスできるという利点がありますが、安全にしてください。

- 編集 -

ほとんどのオペレーティングシステムでは、RAMのペースをドライブとしてマウントすることもできます。RAMドライブ。あなたはそれにオブジェクトを書くことができます(ニールが提案したように)。

于 2012-12-17T08:21:39.307 に答える
2

オブジェクトをピクルしてファイルに保存してみると、プログラムが実行されるたびに、再計算する代わりにオブジェクトを逆シリアル化するだけで済みます。うまくいけば、必要に応じてサーバーのディスク キャッシュがファイルをホットに保ちます。

于 2012-12-17T00:10:01.323 に答える
2

私たちは定期的に、2 Gb よりもはるかに大きなメモリ チャンクを短時間 (数秒) でロードして保存します。3 年前の SAN から 350 Mb/s を得ることができます。

ボトルネック/オーバーヘッドは、主に python オブジェクト管理に関係しているようです。marshal を使用すると、cPickle よりもはるかに高速であることがわかります。最小限の Python オブジェクト ハンドルを含むデータ構造の使用と連携して、これは十分に高速です。

データ構造については、array.arrayまたはを使用できますnumpyarray.array移植性がわずかに高くなりますが(余分なライブラリは必要ありません)numpy、多くの点ではるかに便利です。たとえば、1,000 万の整数 (python オブジェクト) を持つ代わりに、array.array('i')1,000 万の要素を持つ単一のオブジェクトを作成します。

marshal を使用する最良の部分は、c/c++ コードを使用して簡単に読み書きできる非常に単純な形式であることです。

于 2012-12-18T00:29:49.553 に答える
0

問題の説明は漠然としていて、いくつかの異なる方法で読むことができます。

私がこれを読む1つの方法は、ディスク上のデータ構造のある種のASCII表現があるということです。この表現をメモリに読み込んでから、1回以上grepして、特定の正規表現に一致するものを探します。

これを高速化することは、問題のデータ構造に大きく依存します。

単に行分割を行っている場合は、単一の読み取り命令を使用して、すべてをバイト配列に読み取る必要があります。次に、複数行にまたがらないバイト配列grepを使用するようにgrepの方法を変更できます。^.*?最初と.*?$最後に置くことで常に行全体に一致するように式をいじる場合(?最大のムンクではなく最小のムンクを強制します)、一致した式のサイズをチェックして、何バイト先に進むかを調べることができます。

または、モジュールを使用して、mmap何も読み取らずにコピーのオーバーヘッドが発生することなく、同様のことを実現することもできます。

データ構造を作成するために多くの処理が行われていて、ファイル内のデータを単純なバイト配列として非常に生の方法で使用する方法を考えることができない場合は、他のさまざまな解決策が残されていますそれに応じて、これらの中でデーモンを作成することが最良のオプションのように聞こえます。

基本的な操作は「どのテーブルエントリがregexpに一致するかを教えてください」のように見えるので、xmlrpc.serverandxmlrpc.clientライブラリを使用して、正規表現を文字列として受け取り、自然な形式で結果を返す呼び出しを単純にまとめることができます。ライブラリは、関数呼び出しのように見えるものをソケットなどを介してメッセージにまとめるすべての作業を処理します。

さて、実際にそれをメモリに保持するというあなたの考えは、少し厄介です。最近はディスクから2Gの情報を読み取るのに30分もかからないと思います。最大で5、おそらく1未満かかる可能性があります。したがって、データ構造をどのように構築しているかを調べて、代わりにそれを最適化できるかどうかを確認することをお勧めします。

ピクルスやマーシャルが購入するのは、シリアル化された形式からデータ構造を構築するための高度に最適化されたコードです。これにより、データ構造の作成が、代わりにディスクの読み取り速度によって制約される可能性があります。つまり、対処している本当の問題は、毎回ディスクから読み取るのではなく、独自のアドレス空間にデータ構造を構築することです。

そして、それをメモリに保持してデーモンを使用することは、それがメモリにとどまるという保証ではありません。Pythonプロセスのアドレス空間内で必要なデータ構造として構築されたままであることを保証するだけです。OSは、いつでもそのメモリをディスクにスワップすることを決定できます。

繰り返しになりますが、これは、ディスクから読み取る時間に焦点を合わせることが適切な焦点ではない可能性が高いことを意味します。代わりに、Pythonプロセスのアドレス空間でデータ構造を効率的に再作成(または保存)する方法に焦点を当てます。

とにかく、それはこのトピックに関する私の長年の散歩です。あなたの質問の曖昧さを考えると、明確な答えはありません、それで私はただ可能な技術といくつかの指針となるアイデアのスモーガスボードを与えました。

于 2012-12-18T07:30:03.023 に答える