2

私はテキストファイルの大きなディレクトリを持っています-約7GB。それらをiPythonのPythonユニコード文字列にすばやくロードする必要があります。合計15GBのメモリがあります。(私はEC2を使用しているので、どうしても必要な場合はより多くのメモリを購入できます。)

ファイルを読み取るだけでは、私の目的には遅すぎます。ファイルをRAMディスクにコピーして、そこからiPythonにロードしてみました。これで速度は上がりますが、iPythonがクラッシュします(十分なメモリが残っていませんか?)ramdiskのセットアップは次のとおりです。

mount -t tmpfs none /var/ramdisk -o size=7g

誰かアイデアはありますか?基本的に、私は永続的なメモリ内のPythonオブジェクトを探しています。iPython要件では、IncPyを使用できません:http://www.stanford.edu/~pgbovine/incpy.html

ありがとう!

4

2 に答える 2

3

ここには紛らわしいことがたくさんあり、この質問に答えるのがより難しくなっています。

  • ipython 要件。スタンドアロンのスクリプトではなく、ipython 内からこのような大きなデータ ファイルを処理する必要があるのはなぜですか?
  • tmpfs RAM ディスク。あなたの質問は、Python ですべての入力データを一度にメモリに読み込むことを暗示していると読みました。その場合、python は独自のバッファーを割り当ててすべてのデータを保持します。tmpfs ファイルシステムは、RAM ディスクからデータを何度もリロードする場合にのみパフォーマンスを向上させます。
  • IncPyに言及。パフォーマンスの問題がメモ化で解決できるものである場合、メモ化が最も役立つ関数に手動で実装できないのはなぜでしょうか?

そう。メモリ内のすべてのデータが実際に一度に必要な場合 (アルゴリズムがデータセット全体を複数回再処理する場合など) は、mmapモジュールを確認することをお勧めします。これにより、オブジェクトではなく生のバイトでデータが提供されunicodeます。これにより、アルゴリズムでもう少し作業が必要になる場合があります (たとえば、エンコードされたデータの操作) が、妥当な量のメモリを使用します。一度にデータを Pythonunicodeオブジェクトに読み込むには、ディスク上で占有する RAM の 2 倍または 4 倍が必要になります (データが UTF-8 であると仮定)。

アルゴリズムが単純にデータに対して単一の線形パスを実行する場合 (言及した Aho-Corasick アルゴリズムのように)、一度に適切なサイズのチャンクを読み取るだけの方がはるかに優れています。

with codecs.open(inpath, encoding='utf-8') as f:
    data = f.read(8192)
    while data:
        process(data)
        data = f.read(8192)

これが少なくともあなたに近づくことを願っています。

于 2010-09-09T09:44:49.880 に答える
2

あなたの質問で IncPy と IPython の言及を見たので、IncPy の方向に少し進んでいるが、IPython で動作し、大規模なデータに適している私のプロジェクトをプラグインさせてください: http://packages.python .org/joblib/

データを numpy 配列に保存する場合 (文字列は numpy 配列に保存できます)、joblib は中間結果に memmap を使用し、IO に効率的です。

于 2010-09-11T13:32:24.833 に答える