2012-01-08 23 views
5

現在、私はPiCloud上でODEソルバーの複数の繰り返しを含むプロジェクトを実行しています。各反復では、約30行と1500列のNumPy配列が生成され、各反復は前の結果の配列の末尾に追加されます。大きなNumPy配列をファイルに書き込む効率的な方法

通常、これらのかなり大きな配列を関数が返すようにして、それらをメモリに保持し、それらをすべて1つに処理させます。 を除くPiCloudは、送信コストを抑えるために、機能によって返されたり返されるデータのサイズにかなり制限があります。それはかなりのオーバーヘッドで、繰り返し実行されている何千ものジョブを起動しなければならないことを意味しています。

出力をファイルに書き込んだ後、転送制限がない別の関数を使用してファイルを収集するのが最善の解決策です。

私はこれをCSVファイルにダンプするのが最善でしょうか? CSVファイルに各反復を追加するか、最後まで配列内にすべて保持してから一度だけ書き込む必要がありますか?ひどく賢いものがありますか?

答えて

8

中間ファイルが人間が読める理由がない限り、ではなくはCSVを使用します。これは必然的に精度の低下を伴います。

最も効率的なのはおそらく、あらかじめデータのすべての属性を知っているときにファイルをディスクにクイックダンプするためのtofiledoc)です。

プラットフォームに依存しないがnumpy特有のセーブの場合はsavedoc)を使用できます。

ポータブル性が必要な場合、ナンシーとサイフィはHDF5などのさまざまな科学データフォーマットもサポートしています。

+0

人間が読めるようにする理由は本当にありません。ちょうど精度が重要ではないデータセットを移動するためにCSVファイルを使用するのに慣れています(ほとんどのものは整数です)。これは私が探していたものであるようです。 – Fomite

2

pickleモジュールを見ることをおすすめします。 pickleモジュールでは、Pythonオブジェクトをバイトストリーム(例:文字列)としてシリアル化できます。これにより、それらをファイルに書き込んだり、ネットワーク経由で送信したり、後でオブジェクトを再インスタンス化することができます。

+1

使用はcPickleの代わりに、漬物、それが道高速です。 – Martlark

+0

pickleは即座に使用するのに適していますが、Pythonのバージョン間で移植する必要がある場合には使用しないでください(古いバージョンとの互換性はありません。つまり、3.xは、 )numpyにネイティブ形式を使用します。 (http://bugs.python.org/issue6784) – staticd

2

JOBLIBの主要コンポーネントのJoblib - Fast compressed persistence

一つを試してみて、それが任意のPythonオブジェクトを永続化し、非常にすぐにそれらをリードバックする機能ですです。重量物の多い配列で重い持ち上げをするコンテナにとっては特に効率的です。素晴らしいスピードを達成するためのトリックは、numpy配列を別々のファイルに保存し、memmappingを使用してそれらをロードすることでした。

編集: Newer (2016) blog entry on data persistence in Joblib

関連する問題