11

Python で分析する必要がある実験から出力された一連の大きなテキスト ファイル (最大 1 ギガ) があります。それらは、最初の質問を提示する 2D numpy 配列にロードするのが最適です。

  • ローディングの開始時には行数が不明なため、非常に大きな numpy 配列を行ごとに最も効率的に構築するにはどうすればよいでしょうか?

2 つの大きな配列が一時的に共存するため、単に行を配列に追加するだけではメモリの観点から非効率的です。を使用すると、同じ問題が発生するようですnumpy.append。関数は有望ですが、理想的には配列をそのstack場で成長させたいと思います。

これは、2 番目の質問につながります。

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

上記の問題を調査するために、通常のメモリ プロファイリング ツール (heapy と pympler) を使用しましたが、外側の配列オブジェクトのサイズ (80 バイト) しか得られず、含まれているデータは得られません。Python プロセスが使用しているメモリの量を大まかに測定する以外に、配列が大きくなるにつれて配列の「フル」サイズを取得するにはどうすればよいですか?

ローカルの詳細: OSX 10.6、Python 2.6、ただし一般的なソリューションは大歓迎です。

4

4 に答える 4

7

可能な最大サイズの空の配列 (numpy.empty) を作成し、最後にそのビューを使用する以外に、配列を確実に拡大できるようにする方法はありません。他のデータを壊さずにマップのメモリを拡張できるという保証はないため、小さく始めることはできません。(そして、これらはすべて、Python でインタープリター内から取得できるレベルよりもはるかに低いレベルです。)

あなたの最善の策はおそらくnumpy.fromiterです。ソースを見ると、アイテムの数が増えるにつれて、配列は毎回 50% 強ずつ拡張されています。行数を簡単に取得できる場合 (行を数えることなど)、count を渡すこともできます。

于 2009-10-07T21:14:40.317 に答える
2

memmapファイルを使ってみましたか?入力ファイルを(可能であればチャンクで)反復処理し、受信データを変換して、メモリマップされたnumpy配列に行として挿入できます。欠点は、メインメモリが不足していて、スワップからのページングが必要になった場合に、より多くのディスクI/Oが発生することです。

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

もう1つの選択肢はPyTablesです。特別なSQLのようなテーブルを作成する必要がありますが、それはかなり簡単です。実際、データの透過的なディスク永続性(自動シリアル化)と階層構造を提供します。また、使用されるメインメモリの量も制限されます。

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

頑張ってください!

于 2011-01-12T07:05:17.053 に答える
1

可能なオプションは、最初にファイルを 1 回パスして行数をカウントし、行をロードしないことです。

もう 1 つのオプションは、毎回テーブル サイズを 2 倍にすることです。これには 2 つの利点があります。

  1. メモリを log(n) 回だけ再割り当てします。n は行数です。
  2. 最大のテーブル サイズよりも 50% 多い RAM しか必要ありません

動的ルートを使用する場合、最初の行の長さをバイト単位で測定し、(ファイル内のバイト数 / 最初の行内のバイト数) を計算して行数を推測できます。このサイズのテーブルから始めます。

于 2009-10-07T21:32:59.703 に答える
0

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

于 2013-02-12T11:13:06.917 に答える