Python 3内存错误,用于具有大型稀疏矩阵的大型循环

2024-04-26 06:27:03 发布

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

我正在使用一个代码,该代码涉及创建一个相对稀疏的大型矩阵,并使用它解决最小二乘最小化问题。然而,当我运行代码时,我一直在得到内存错误,尽管事实上矩阵似乎不应该太大,足以使我的系统紧张(在我的测试用例中,大约是27000到2100)

我已经创建了一个简化的代码,它与我的测试用例具有相同的存储要求,并且还生成了一个内存错误(请注意,“稀疏”矩阵实际上不是非常稀疏的,因为我正在测试一个比实际预期数据集需要的更小规模的问题):

import numpy as np
from scipy import sparse

BM = sparse.lil_matrix((27000, 3000))
for i in range(0, 3000):
    local_mat = np.random.rand(30,30,30)
    local_mat[local_mat<0.1] = 0
    vals = local_mat.ravel()
    nonzero = vals.nonzero()
    BM[nonzero, i] = vals[nonzero]

如果我更改参数,使稀疏矩阵中有更多的零条目,在填充矩阵行并对其执行最小化问题后,我仍然会从scipy.sparse.linalg.lsq_linear中获得内存错误

不用说,如果我也使用稠密矩阵,就会出现内存错误

我曾尝试将分页文件的大小增加到2-4G字节,但没有任何帮助,尽管看起来这不应该是内存密集型的


Tags: 内存代码importlocal系统错误np测试用例
1条回答
网友
1楼 · 发布于 2024-04-26 06:27:03

你创造了一个记忆篝火。让我们回忆一下lil_matrix是如何工作的:

矩阵的每一行都保存为python列表。一个列表用于数据,另一个列表用于索引。每个非零元素在每个列表上都有一个条目

27000, 3000矩阵为例,让我们将其相加。python列表中的每个条目都是一个消耗16字节开销的对象。对于数据列表,浮点数据本身是另一个8字节。所以只有非零值会消耗2GB。现在让我们看看索引——另一组列表,其中每个条目消耗16字节的开销。噗-又少了1.5 GB。为列表和保存它们的数组提供更多的内存,但这与已经减少的内存相比并不多

与占用650MB内存的27000, 3000密集型阵列相比,您已设法使用了额外的5倍内存,同时与numpy阵列相比还存在一些主要的缺点。像CSR这样的标准稀疏格式将是一个更好的选择-对于90%密集的示例,它将使用大约900MB的内存

编辑:您还试图调用一个绝对需要CSR矩阵的函数,因此该函数将您创建的可怕的lil_matrix转换为csr_matrix,迫使您在内存中保留此数据的两个完整副本

相关问题 更多 >