0

辞書、リストのリスト、およびnumpy配列を含むいくつかの変数があります。obj=[var1,var2,...,varn] の次のコードでそれらをすべて保存します。変数のサイズは、メモリにロードするのに十分小さいです。

私の問題は、対応する変数をmatlabに保存すると、出力ファイルがPythonで行うよりもディスク上のスペースがはるかに少なくなることです。同様に、ディスクから変数をロードすると、matlab よりも Python でメモリにロードするのに多くの時間がかかります。

with open(filename, 'wb') as output:
    pickle.dump(obj, output, pickle.HIGHEST_PROTOCOL)

ありがとう

4

3 に答える 3

1

Matlab は HDF5 と圧縮を使用してマット ファイルを保存します。HDF5 は、大量のデータに非常に高速にアクセスするためのフォーマットです。Python-pickle は、オブジェクトを再作成するための情報を安全に保管します。速度とサイズは最適化されていませんが、柔軟性があります。必要に応じて、Python に HDF5 を使用します。

于 2014-09-07T16:48:38.627 に答える
0

さて、問題は Python 自体ではなく pickle にあります。他の人が言及したように、バージョン 7.3 以降で保存された .mat ファイルは HDF5 形式を使用します。HDF5 は、大規模なデータセットを効率的に保存および取得できるように最適化されています。Pickle はデータを異なる方法で処理します。h5py または netcf4 Python モジュールを使用することで、Matlab の save 関数のパフォーマンスを再現するか、それを超えることさえできます。NetCDF は HDF5 のサブセットです。たとえば、HDF5 を使用すると、次のことができます。

import h5py
import numpy as np

f = h5py.File('test.hdf5','w')
a = np.arange(10)
dset = f.create_dataset("init", data=a)
f.close()

MATLAB で同等の処理を行ってもまったく同じサイズのファイルになるかどうかはわかりませんが、近いはずです。HDF5 の圧縮機能をいじって、必要な結果を得ることができます。

編集1:

file などの HDF5 ファイルをロードするには、次の.matようにしますM2 = h5py.File('file.mat')。M2 は HDF5 グループで、python 辞書のようなものです。実行M2.keys()すると、変数名が得られます。変数の 1 つが「data」という配列である場合は、 を実行して読み取ることができますdata = M2["data"][:]

編集2:

複数の変数を保存するために、複数のデータセットを作成できます。基本的な構文はf.create_dataset("variable_name", data=variable). その他のオプションについては、リンクを参照してください。例えば

import h5py
import numpy as np

f = h5py.File('test.hdf5','w')

data1 = np.ones((4,4))
data2 = 2*data1
f.create_dataset("ones", data=data1)
f.create_dataset("twos", data=data2)

fファイル オブジェクトと HDF5 グループの両方です。したがって、次のようになりf.keys()ます。

[u'ones', u'twos']

「ones」キーの下に保存されているものを表示するには、次のようにします。

f['ones'][:]

array([[ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.]])

データセットはいくつでも作成できます。ファイルの書き込みが完了したら、ファイル オブジェクトを閉じます: f.close().

ここでの私のアプローチは、配列のようなデータセットに対してのみ機能することを付け加えておきます。リストや辞書など、他の Python オブジェクトを保存することもできますが、それにはもう少し作業が必要です。私は、大規模な numpy 配列に対してのみ HDF5 に頼っています。他のすべてについては、ピクルは私にとってはうまく機能します。

于 2014-09-09T00:43:49.873 に答える