9

cPickleとプロトコルバージョン2を使用して、いくつかの計算結果をダンプしました。コードは次のようになります。

> f = open('foo.pck', 'w')
> cPickle.dump(var, f, protocol=2)
> f.close()

変数varは、長さが2のタプルです。var [0]のタイプはリストであり、var[1]はnumpy.ndarrayです。

上記のコードセグメントは、大きなサイズ(〜1.7G)のファイルを正常に生成しました。

しかし、foo.pckから変数を読み込もうとすると、次のエラーが発生しました。

ValueError                                Traceback (most recent call last)
/home/user_account/tmp/<ipython-input-3-fd3ecce18dcd> in <module>()
----> 1 v = cPickle.load(f)
ValueError: buffer size does not match array size

読み込みコードは次のようになります。

> f= open('foo.pck', 'r')
> v = cPickle.load(f)

また、(cPickleの代わりに)pickleを使用して変数をロードしようとしましたが、次のような同様のエラーメッセージが表示されました。

ValueError                                Traceback (most recent call last)
/home/user_account/tmp/<ipython-input-3-aa6586c8e4bf> in <module>()
----> 1 v = pickle.load(f)

/usr/lib64/python2.6/pickle.pyc in load(file)
   1368 
   1369 def load(file):
-> 1370     return Unpickler(file).load()
   1371 
   1372 def loads(str):

/usr/lib64/python2.6/pickle.pyc in load(self)
    856             while 1:
    857                 key = read(1)
--> 858                 dispatch[key](self)
    859         except _Stop, stopinst:
    860             return stopinst.value

/usr/lib64/python2.6/pickle.pyc in load_build(self)
   1215         setstate = getattr(inst, "__setstate__", None)
   1216         if setstate:
-> 1217             setstate(state)
   1218             return
   1219         slotstate = None

ValueError: buffer size does not match array size

同じコードセグメントをはるかに小さいサイズのデータ​​で試しましたが、正常に機能しました。ですから、私の一番の推測は、ピクルス(またはcPickle)のロードサイズの制限に達したということです。ただし、(大きなサイズの変数を使用して)正常にダンプするのは奇妙ですが、ロードに失敗しました。

これが実際に読み込みサイズの制限の問題である場合、どのようにバイパスする必要がありますか?そうでない場合、問題の考えられる原因は何でしょうか?

任意の提案をいただければ幸いです。ありがとう!

4

1 に答える 1

3

numpy 配列をnumpy.save()&で保存 & ロードするのはどうnp.load()ですか?

pickled リストと numpy 配列を同じファイルに保存できます。

import numpy as np
import cPickle
data = np.random.rand(50000000)
f = open('foo.pck', 'wb')
cPickle.dump([1,2,3], f, protocol=2)
np.save(f, data)
f.close()

データを読み取るには:

import cPickle
import numpy as np
f= open('foo.pck', 'rb')
v = cPickle.load(f)
data = np.load(f)
print data.shape, data
于 2012-08-22T06:37:45.123 に答える