Python:在使用numpy数组时避免内存错误的另一种方法?

2024-05-19 02:11:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python的新手,开始使用numpy。我遵循了论文中的一个算法,对于我的数据集,它需要一个维数为1百万*1百万的数组。在

确切的代码是larray(np.random.normal(0, sigma**2, size=(794832, 794832))

尽管我有一个16gbram,numpy在创建时尝试将数组加载到内存中,因此,我得到了memoryerror。我尝试使用惰性初始化与lazyarray一起使用,但仍然不起作用。在

有没有办法创建一个使用文件系统而不是ram的数组?在

提前谢谢。在


Tags: 数据内存代码numpy算法sizenprandom
1条回答
网友
1楼 · 发布于 2024-05-19 02:11:05

您正在创建的数据大小将取决于矩阵大小和数据的精度类型。在

您正试图使用np.random.normal创建一个具有float64精度类型值的矩阵。64位表示每个数字使用64位,因此每个数字需要8字节的内存(每字节8位)。如果矩阵的形状/维数为4000x794832,这意味着您需要~23.7GB[4000*794832*8]的内存分配。在

如果你有一个16GB的内存,这应该是不够的,所以它将使用交换(如果足够定义),它可能需要一些时间来创建它,或者只是耗尽内存。在

问题是,你需要float64精度吗?因为这似乎对科学家的发展很有帮助。所以,为了加速下面的数学运算,可以考虑将矩阵精度类型改为float16,例如[4000*794832*2]。在

import numpy as np
a = np.random.normal(0, 0.7**2, size=(4000,794832))
a.nbytes   # will give a size of 25434624000 [~23.7GB] (huge number)
b = np.random.normal(0, 0.7**2, size=(4000,794832)).astype(np.float16)
b.nbytes   # will give a size of 6358656000 [~5.9GB](big but at least you can do everything on RAM)

这个例子的问题是np.random.normal没有直接定义numpydtype的选项,所以您将创建一个float64矩阵,然后对其进行转换,这不是一个非常有效的选项。但是如果没有其他选择。。。在

相关问题 更多 >

    热门问题