NumPy数组需要多少内存?RAM是一个限制因素吗?

9

我正在使用numpy创建一个边长为100的立方体数组,因此总共包含100万个条目。对于这一百万个条目中的每一个,我都插入了一个100x100矩阵,其条目由随机生成的数字组成。 我使用以下代码执行此操作:

import random
from numpy import *

cube = arange(1000000).reshape(100,100,100)

for element in cube.flat:
    matrix = arange(10000).reshape(100,100)
    for entry in matrix.flat:
        entry = random.random()*100
    element = matrix

我本以为这个过程会花费一段时间,但是产生了100亿个随机数后,我不确定我的电脑是否能够处理。这样的数组需要多少内存?内存大小是否会成为一个限制因素,如果我的电脑没有足够的内存,是否无法生成该数组?

另外,如果有更有效的实现该代码的方法,我将不胜感激 :)


4
假设使用double精度,每个占8字节,如果你真的想要存储100亿个这样的数,那就需要80GB的内存。如果你需要问这个问题,那么你的计算机内存不够。话虽如此,看起来你正在创建它们但并没有存储它们,所以你应该没问题。 - Gabe
这个回答解决了你的问题吗?Python中Numpy数组的内存使用情况 - YaOzI
2个回答

23

有几点需要注意:

  • Numpy数组在内存中的大小很容易计算。它只是元素数量乘以数据大小,再加上一些小的常量开销。例如,如果你的cube.dtypeint64,并且它有1,000,000个元素,则需要1000000 * 64 / 8 = 8,000,000字节(8Mb)。
  • 然而,正如@Gabe所指出的,100*100*1,000,000个双精度浮点数将需要约80 Gb
  • 这不会导致任何东西“崩溃”,但由于电脑需要进行所有换页操作,因此操作将变得非常缓慢。
  • 你的循环将不会按照你的期望执行。替换cube中的元素时,element = matrix仅仅会覆盖element变量,而不会改变cube本身。对于entry = random.rand() * 100同样适用。
  • 相反,参见:http://docs.scipy.org/doc/numpy/reference/arrays.nditer.html#modifying-array-values

1
如果您超出了可用虚拟内存的总量,事情确实会“崩溃”,而在这种情况下似乎非常可能会发生,因为不多有人拥有80GB以上的交换空间。 - ali_m
1
这并不完全适用于处理 np.zeros() 等函数。懒加载被使用(至少在 Linux 版本中),它将避免在访问某些元素之前使用大量内存。例如,您可以使用 np.zeros((24000,24000)) 创建一个矩阵,它不会占用太多内存,但如果您使用 np.random.random((24000,24000)),它将占用略高于 4 GB 的空间。更好的解释:https://dev59.com/-14c5IYBdhLWcg3wvsfB - Max Candocia

2

针对你的函数中的“内部”部分,请查看numpy.random模块。

import numpy as np
matrix = np.random.random((100,100))*100

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接