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

标签 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,#samples:200000,numpy 浮点字节:4):

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

实际使用的内存量:

~7.5 GB

有没有更节省内存的方法来实现这一点?

最佳答案

可以使用生成器和行/列 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 添加到列表而不是整个行,只需索引该行,并在需要时添加翻译/转换。

关于python - 为什么这个 python 列表需要这么多内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45807118/

相关文章:

python - 从 Scipy 调用统计函数

java - OutOfMemoryError 异常 : Java heap space, 如何调试...?

python - 使用观察值和期望值运行卡方检验并获得置信区间

python - 查找至少一行包含字母的列

Python - Pandas - groupby 和 "agg"- 当组包含 nan 时将聚合设置为 nan

python - 是什么导致我的 Python 程序使用 opencv 耗尽内存?

c - C 结构的数据对齐

javascript - 如何实现我的 JavaScript 表单想法?

python - 多个维度的 Numpy 滚动

python - ndimage 的 center_of_mass 用于计算高斯峰的位置