ディスク上にNumPy配列を保存する最良の方法 質問する

ディスク上にNumPy配列を保存する最良の方法 質問する

大きな numpy 配列を高速に保存する方法を探しています。バイナリ形式でディスクに保存し、比較的高速にメモリに読み込みたいのですが、残念ながら cPickle では十分高速ではありません。

私は見つけたnumpy.savezそしてnumpy.loadしかし奇妙なことに、numpy.load は npy ファイルを「メモリマップ」に読み込みます。つまり、配列の通常の操作は非常に遅くなります。たとえば、次のような操作は非常に遅くなります。

#!/usr/bin/python
import numpy as np;
import time; 
from tempfile import TemporaryFile

n = 10000000;

a = np.arange(n)
b = np.arange(n) * 10
c = np.arange(n) * -0.5

file = TemporaryFile()
np.savez(file,a = a, b = b, c = c);

file.seek(0)
t = time.time()
z = np.load(file)
print "loading time = ", time.time() - t

t = time.time()
aa = z['a']
bb = z['b']
cc = z['c']
print "assigning time = ", time.time() - t;

より正確に言うと、最初の行は非常に高速ですが、配列を割り当てる残りの行はobj途方もなく遅くなります。

loading time =  0.000220775604248
assining time =  2.72940087318

NumPy 配列を保存するより良い方法はありますか? 理想的には、複数の配列を 1 つのファイルに保存できるようにしたいと考えています。

ベストアンサー1

NumPy 配列を保存するさまざまな方法のパフォーマンス (スペースと時間) を比較しました。ファイルごとに複数の配列をサポートしている方法はほとんどありませんが、いずれにしても役に立つかもしれません。

NumPy配列ストレージのベンチマーク

Npy とバイナリ ファイルはどちらも、高密度データに対して非常に高速で小さいです。データがまばらであったり、非常に構造化されている場合は、圧縮された npz を使用すると、多くのスペースを節約できますが、読み込みに時間がかかります。

移植性が問題になる場合は、npy よりもバイナリの方が適しています。人間が読みやすいことが重要な場合は、パフォーマンスを大幅に犠牲にする必要がありますが、csv を使用するとかなりうまく実現できます (もちろん、これも非常に移植性があります)。

詳細とコードは以下から入手できます。githubリポジトリ

おすすめ記事