我试图在Python中有效地存储2500万个整数。最好使用Numpy,这样我就可以对它们进行操作了。
我们的想法是将它们存储为4字节无符号整数。所以所需的内存应该是25M条目* 4字节= 95 MB。
我写了以下测试代码,报告的内存消耗几乎是700 MB,为什么?
a = np.array([], dtype=np.uint32)
# TEST MEMORY FOR PUTTING 25 MILLION INTEGERS IN MEMORY
for i in range(0, 25000000):
np.append(a, np.asarray([i], dtype=np.uint32))
如果我这样做,它按预期工作:
a = np.random.random_integers(1, 25000000, size=25000000)
为什么?
答案 0 :(得分:2)
实际上问题是range(0, 25000000)
,因为这会创建一个由int
组成的列表。
包含这样一个列表所需的内存是(为简单起见,假设每个整数为32字节)25kk * 32B = 800kkB ~ 762MB
。
使用类似生成器的xrange
或更新到python3那里range
的内存成本更低(因为这些值不是预先计算的,而是在需要时进行评估)。
实际的numpy数组总是为空的(因为你只用np.append
创建一个临时副本 - 后续的结果不存储,因此之后直接丢弃!)因此可以忽略不计。
我会与您的a = np.random.random_integers(1, 25000000, size=25000000)
合作,然后将其转换(如果您愿意)到np.uint
。