-2

ディープ ラーニングの問題で大きな numpy 配列をピクルしようとすると、メモリ エラーが発生しますshape: (7451, 1500, 1500, 1))。そうは言っても、いくつかの投稿を見てドキュメントを読んでいますが、実際に使用してピクルファイルとして保存 kleptoする方法がわかりません。klepto

誰か私のためにそれを5年生レベルに分解できますか?

これはメモリエラーをスローしています:

pickle_out = open("X.pickle", "wb")
pickle.dumps(X, pickle_out)
pickle_out.close()
4

2 に答える 2

2

私はklepto著者です。実際に配列をピクルしようとしているだけなら、(配列が大きすぎてメモリの制約内に収まらない場合を除いて)numpyで組み込みdumpメソッドを使用するのが最善の方法です。array

のように、オブジェクト自体にシリアル化メソッドが組み込まれている場合を除き、シリアル化を行うほとんどすべてのコードは、シリアル化パッケージ ( dillcloudpickleまたは) のいずれかを使用します。 、および両方を使用し、配列自体が提供する内部シリアライゼーションを利用します(はそれを使用しないため、シリアライゼーションが膨張し、メモリ障害を引き起こす可能性があります)。picklenumpyjoblibcloudpicklecloudpickledillnumpypickle

>>> import numpy as np
>>> a = np.random.random((1500,1500,1500,1))
>>> a.dump('foo.pkl')

上記の方法でもメモリ エラーが発生する場合はjoblib、配列を小さなチャンクに分割するかklepto、(大きな配列データ用に設計された) 配列をdill潜在的に使用しない限り、dask上記の最適に効率的な方法を使用しても、配列が十分に大きいため、メモリエラーが発生するはずです(自分のシステムでテストしました)。したがって、配列をチャンクに分割するか、dask配列として保存する必要があります。 .

明確にkleptoするために、 は配列以外の大きなデータ (テーブルや辞書など) をdask対象としていますが、 は大きな配列データを対象としています。

別のオプションは、numpy.memmapメモリをバイパスして配列をファイルに直接書き込む配列を使用することです。これらは使用するのが少し複雑daskで、シンプルなインターフェースであなたのためにやろうとしていることです.

于 2019-05-22T18:29:33.213 に答える