【问题标题】:saving and loading large numpy matrix保存和加载大型 numpy 矩阵
【发布时间】:2019-11-04 09:12:17
【问题描述】:

以下代码是我如何保存 numpy 数组,保存后大约 27GB。图像数据超过200K,每个形状为(224,224,3)

hf = h5py.File('cropped data/features_train.h5', 'w')
for i,each in enumerate(features_train):
    hf.create_dataset(str(i), data=each)
hf.close()

这是我用来加载数据的方法,加载需要几个小时。

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()

那么,对于这么大的数据量,有没有人有更好的解决方案?

【问题讨论】:

  • np,append 在循环中效率低下。追加到一个列表,并在最后做一个连接。
  • 一开始,我使用List来追加每个数据,然后将其转换为numpy。但这会导致内存错误。你是什​​么意思在最后做一个连接

标签: python-3.x numpy h5py


【解决方案1】:

你没有告诉我们你的服务器有多少物理内存, 但是 27 GiB 听起来“很多”。 考虑将您的运行分成几个较小的批次。

在 Java 领域有一个老锯子问“为什么它有二次运行时?”, 也就是说,“为什么这么慢?”

String s = ""
for (int i = 0; i < 1e6, i++) {
    s += "x";
}

答案是接近尾声, 在每次迭代中,我们正在阅读〜一百万个字符 然后写它们,然后附加一个字符。 成本为 O(1e12)。 标准解决方案是使用 StringBuilder 所以我们回来了 到预期的 O(1e6)。

在这里,我担心调用 np.append() 会将我们推入二次状态。

要验证,请将features_train 赋值替换为简单的评估 的np.array([x]),所以我们花一点时间计算然后立即丢弃 每次迭代的那个值。 如果猜想正确,运行时间会小很多。

要解决这个问题,请避免致电.append()。 相反,使用 np.zeros() 预分配 27 GiB (或np.empty()) 然后在循环中分配每个新读取的数组 到其预分配槽的偏移量。 线性运行时将允许任务更快地完成。

【讨论】:

  • 谢谢,我认为这可能是加载时间过长的原因。顺便说一下,内存是 32GB
猜你喜欢
  • 2010-12-14
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
相关资源
最近更新 更多