为什么这个 python 列表需要这么多内存?
Why does this python list need so much more memory?
我想在 python 中创建一个 numpy 数组列表。数组大部分是零,很少有标志设置为一。
当运行ning下面的代码时,我运行进入内存问题。该代码需要~两倍于我期望它使用的内存。
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 float 字节:4):
(6000 * 200000 * 4) /(2**30.0) ~= 4.47 GB
实际使用的内存量:
~7.5 GB
有没有更节省内存的方法来实现这个目标?
可以使用生成器和 row/column 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()
这种方法的缺点是只能访问 row/column id 和当前 tmp 行,但是它减少了 data
加一行所需的内存量。
另一种方法可能是仅将行 ID 添加到列表而不是整行,只需索引该行,如果需要,添加 translation/transform.
我想在 python 中创建一个 numpy 数组列表。数组大部分是零,很少有标志设置为一。
当运行ning下面的代码时,我运行进入内存问题。该代码需要~两倍于我期望它使用的内存。
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 float 字节:4):
(6000 * 200000 * 4) /(2**30.0) ~= 4.47 GB
实际使用的内存量:
~7.5 GB
有没有更节省内存的方法来实现这个目标?
可以使用生成器和 row/column 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()
这种方法的缺点是只能访问 row/column id 和当前 tmp 行,但是它减少了 data
加一行所需的内存量。
另一种方法可能是仅将行 ID 添加到列表而不是整行,只需索引该行,如果需要,添加 translation/transform.