Python 3.x 保存和加载大numpy矩阵
下面的代码是我如何保存numpy阵列的,保存后大约为27GB。有超过200K的图像数据,每个形状为(224,3) 这是我用来加载数据的方法,加载需要几个小时Python 3.x 保存和加载大numpy矩阵,python-3.x,numpy,h5py,Python 3.x,Numpy,H5py,下面的代码是我如何保存numpy阵列的,保存后大约为27GB。有超过200K的图像数据,每个形状为(224,3) 这是我用来加载数据的方法,加载需要几个小时 features_train = np.zeros(shape=(1,224,224,3)) hf = h5py.File('cropped data/features_train.h5', 'r') for key in hf.keys(): x = hf.get(key) x = np.array(x)
features_train = np.zeros(shape=(1,224,224,3))
hf = h5py.File('cropped data/features_train.h5', 'r')
for key in hf.keys():
x = hf.get(key)
x = np.array(x)
features_train = np.append(features_train,np.array([x]),axis=0)
hf.close()
那么,对于如此大的数据量,有谁有更好的解决方案吗 您没有告诉我们您的服务器有多少物理RAM, 但27 GiB听起来像“很多”。 考虑把你的跑步分成几个较小的批次。< /P> java land中有一个古老的saw,它会问“为什么有二次运行时?”, 那就是,“为什么这么慢?”
String s=“”
对于(int i=0;i<1e6,i++){
s+=“x”;
}
答案是,到最后,,
在每一次迭代中,我们都会读到大约一百万个字符
然后写它们,然后附加一个字符。
成本为O(1e12)。
标准解决方案是使用StringBuilder,这样我们就回来了
到预期的O(1e6)
在这里,我担心调用np.append()
会将我们推入二次区域
要进行验证,请将功能\u train
分配替换为简单的评估
对于np.array([x]),我们花了一些时间计算,然后立即丢弃
每个迭代中的值。
如果这个猜想是正确的,那么运行时间将小得多
要解决此问题,请避免调用.append()
。
相反,使用np.zeros()预先分配27 GiB
(或)
然后在循环中分配每个新读取的数组
插入其预分配插槽的偏移量。
线性运行时将使任务更快地完成。谢谢,我认为这可能是加载时间过长的原因。RAM是32GB顺便说一句,append在循环中效率很低。追加到一个列表,并在末尾进行一次连接。在开始时,我使用list追加每个数据,然后将其转换为numpy。但这会导致内存错误。你是什么意思?一个连接在最后
features_train = np.zeros(shape=(1,224,224,3))
hf = h5py.File('cropped data/features_train.h5', 'r')
for key in hf.keys():
x = hf.get(key)
x = np.array(x)
features_train = np.append(features_train,np.array([x]),axis=0)
hf.close()
String s = ""
for (int i = 0; i < 1e6, i++) {
s += "x";
}