2009-10-07 9 views
11

私は、Pythonで解析する必要がある実験から出力される一連の大きなテキストファイル(最大1ギガバイト)を持っています。彼らは最高の最初の質問提示2D numpyの配列にロードされます:行の数が最も効率的に構築することが非常に大きなnumpyの配列を できるか、ロードの開始時には不明であるためnumpyアレイをインクリメンタルに構築し、メモリ使用量を測定する

  • を、行ごとに?

単純に2つの大きな配列が同時に存在するため、配列に行を追加するだけではメモリの効率が悪くなります。同じ問題は、numpy.appendを使用した場合に発生するようです。 stackの機能は有望ですが、私は理想的には、その場所でアレイを成長させたいと考えています。

これは、2番目の質問につながる:

  • 重く がnumpyの配列を使用するPythonプログラムのメモリ使用量を観察するための最良の方法は何ですか?

上記の問題を調べるために、通常のメモリプロファイリングツールheapyとpymplerを使用しましたが、外側の配列オブジェクト(80バイト)のサイズだけを取得しています。 Pythonプロセスがどれだけのメモリを使用しているのかを測定していないのですが、どのようにして配列の「フル」サイズになるのでしょうか?

ローカル詳細:OSX 10.6、Python 2.6、しかし一般的な解決策は大歓迎です。

答えて

7

可能な最大サイズの空の配列(numpy.empty)を作成し、最後にそれを表示する以外の方法で配列を拡張する方法はありません。他のいくつかのデータを壊さずに地図がどのようなメモリでも拡張できるという保証はないので、小さくすることはできません。 (そしてこれはすべて、Pythonがインタプリタの内部から得ることができるレベルよりはるかに低いレベルです。)

おそらくnumpy.fromiterです。ソースを見ると、項目数が増えると、その都度配列が50%強ずつ拡大されます。あなたが簡単に行の数を得ることができれば(行を数えることから)、それに数を渡すことさえできます。

1

可能なオプションは、ファイルをロードせずに行数をカウントするために最初にファイルを1回通過させることです。

  1. あなたが唯一の再アロケーションメモリログnは行数である(N)倍以下となります。

    他のオプションは、あなたのテーブルサイズ2つの利点がありますたびに、倍増することです。あなたが動的なルートを取る場合、あなたはバイトの最初の行の長さを測定することができ

  • あなたは、あなたの最大の表のサイズよりも50%多くのRAMを必要とし、その後、(計算することにより、numは行数を推測します最初の行のファイル/ numバイトのバイト)。このサイズのテーブルから始めましょう。

  • +0

    ありがとうございます。ファイルのサイズを考えると、私は最初のパスをカウントするだけでは消極的でしたが、メモリ問題を解決する最も簡単で効率的な方法です。 –

    +1

    私は同僚に最近同様の質問をしましたが、私は最初のパスからあなたを救う別の可能性を思いつきました。ファイル内の「要素」のおおよそのサイズを知っていれば、それをファイルサイズに分割することができます。安全のためにいくつかのパディングを追加すると、メモリ全体に書き込むことができます。特別な、初期化されていない、非表示にするには、データを持つ要素のみのビューを使用できます。あなたは行き​​過ぎていないことを確認する必要があります。完璧ではありませんが、ファイルの読み取り速度が遅く、データが一貫してレイアウトされていると、動作する可能性があります。 – AFoglia

    2

    memmapファイルを使用しようとしましたか?可能であれば、入力ファイルを繰り返し処理し、入力データを変換し、行をメモリマップのnumpy配列に挿入することができます。不十分なメインメモリがあり、スワップからのページングが必要になった場合に備えて、ディスクI/Oが低下します。

    参照:http://docs.scipy.org/doc/numpy/reference/generated/numpy.memmap.html

    別の方法としては、PyTablesです。特別なSQL形式のテーブルを作成する必要がありますが、かなりシンプルです。実際、透過的なディスク永続性(自動化されたシリアライゼーション)とデータの階層的な構成を提供します。また、使用されるメインメモリの量も制限されます。

    参照:www.pytables.org/moin/HowToUse

    運のベスト!

    0

    問題は本質的にテキストファイルです。あなたの入力データがより高度に格納されると、そのような問題を回避することができます。例えば、h5py projectを見てください。最初にデータをHDF5ファイルに変換してから、HDF5ファイルで解析スクリプトを実行することは問題になります。

    関連する問題