为什么这个python列表需要这么多内存?
我想用python创建一个numpy数组列表。数组大多为零,很少有标志设置为1 在运行以下代码时,我遇到了内存问题。这段代码需要的内存是我预期的两倍 填充列表的Python循环:为什么这个python列表需要这么多内存?,python,numpy,memory,one-hot-encoding,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[
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,#样本:200000,numpy浮点字节:4):
实际使用的内存量:
~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行,但是它减少了数据
加一行所需的内存量
另一种方法可能是只将行id而不是整行添加到列表中,只对行进行索引,如果需要,还可以添加翻译/转换。如果我理解正确,
数据和矢量化的_数据都保存在内存中。@jmunch这是正确的。np.zeros(6000)。dtype==dtype('float64')
和np.dtype(np.float64).itemsize==8
(至少在我的电脑上是这样)-这可以解释你乘以错误数字的大小差异,它们是8个字节,而不是4个字节。也许您需要np.zero(6000,np.float32)
(或np.int32
)。数组必须存储其所有值,而不仅仅是您更改的值。我不知道文档中的引用与此有什么关系。data
是列表还是数组?如果数组数据[:20000]
未进行复制。
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()