为什么这个python列表需要更多的内存?

时间:2017-08-22 00:08:07

标签: python numpy memory one-hot-encoding

我想在python中创建一个numpy数组列表。这些数组大多是零,几个标志设置为1。

运行以下代码时,我遇到了内存问题。代码需要〜我希望它使用的内存的两倍。

填充列表的Python循环:

vectorized_data = []
os.system("free -m")
for dat in data: #data has length 200000
    one_hot_vector = np.zeros(6000)
    for d in dat:
        one_hot_vector[d] = 1
    vectorized_data.append(one_hot_vector)
os.system("free -m") ##memory usage goes up by ~7.5GB

我期望此代码使用的内存量(向量维度:6000,#sample:200000,numpy float bytes:4):

(6000 * 200000 * 4) /(2**30.0) ~= 4.47 GB

实际使用的内存量:

~7.5 GB

有没有更多的内存效率方法来实现这一目标?

1 个答案:

答案 0 :(得分:2)

可以使用生成器和行/列ID,如:

def yield_row(data):
  for r_id, dat in enumerate(data):
      tmp = np.zeros(6000)
      for d in dat:
          tmp[d] = 1
      yield r_id, tmp

for r_id, tmp in yield_row(data):
  if is_hot_vector(tmp):
    do_stuff()

这种方法的缺点是只能访问行/列ID和当前的tmp行,但是它会减少data加上一行所需的内存量。

另一种方法可能是只将行id添加到列表而不是整行,只需将行索引,如果需要,添加转换/转换。