Python numpy矩阵乘法或einsum运算中的内存错误
我正在处理行和列的二进制(仅0和1)矩阵,其顺序为几千。例如,行数在2000-7000之间,列数在4000-15000之间。我的电脑内存超过100克 我感到惊讶的是,即使有了这些尺寸,我也会通过以下代码获得Python numpy矩阵乘法或einsum运算中的内存错误,python,numpy,matrix,out-of-memory,Python,Numpy,Matrix,Out Of Memory,我正在处理行和列的二进制(仅0和1)矩阵,其顺序为几千。例如,行数在2000-7000之间,列数在4000-15000之间。我的电脑内存超过100克 我感到惊讶的是,即使有了这些尺寸,我也会通过以下代码获得MemoryError。为了再现性,我举了一个例子,其中矩阵(10*20)比下面两个都小,这会引起这个错误: import numpy as np my_matrix = np.random.randint(2,size=(10,20)) tr, tc = np.triu_
MemoryError
。为了再现性,我举了一个例子,其中矩阵(10*20)比下面两个都小,这会引起这个错误:
import numpy as np
my_matrix = np.random.randint(2,size=(10,20))
tr, tc = np.triu_indices(my_matrix.shape[0],1)
ut_sums = np.sum(my_matrix[tr] * my_matrix[tc], 1)
denominator = 100
value = 1 - ut_sums.astype(float)/denominator
np.einsum('i->', value)
我尝试将上述代码中的元素乘法替换为einsum,如下所示,但它也会生成相同的MemoryError:
import numpy as np
my_matrix = np.random.randint(2,size=(10,20))
tr, tc = np.triu_indices(my_matrix.shape[0],1)
ut_sums = np.einsum('ij,ij->i', my_matrix[tr], my_matrix[tc])
denominator = 100
value = 1 - ut_sums.astype(float)/denominator
np.einsum('i->', value)
在这两种情况下,打印的回溯都指向正在计算ut\u和的行
请注意,我的代码也有其他操作,还有其他统计数据是在类似大小的矩阵上计算的,但超过100g,我认为这应该不是问题。仅仅因为您的计算机有100 GB的物理内存,并不意味着您的操作系统愿意或能够分配如此大量的连续内存。它必须是连续的,因为NumPy数组通常是这样的
您应该弄清楚输出矩阵的大小,然后尝试自己创建一个类似的矩阵:
arr = np.zeros((10000, 10000))
查看是否可以分配一个任意大的数组。我也可以创建带有np.0((100000,100000))的矩阵,但由于内存错误,无法创建大小为1000000*1000000的矩阵。但是,我的矩阵要小得多。我能帮你解决吗?矩阵为二进制(仅限1和0)且稀疏。我可以使用scipy的稀疏矩阵吗?elemet wise乘法或einsum运算是否适用于稀疏矩阵?是的,如果您的数据是稀疏的,您应该利用NumPy和friends中的稀疏矩阵功能。如果你的矩阵只有0和1:你使用的是dtype=bool
?不,我没有使用dtype=bool。现在我想到了它,我可以在创建矩阵时使用它,但我还没有想到如何用布尔矩阵计算ut_和。另外,刚才我尝试了scipy.sparse的lil_矩阵,像上面的第一个代码块一样进行元素乘法。但在一台功能相对强大的机器上,它运行了大约15分钟,然后出现了MemoryError故障。stacktrack指向我从原始创建稀疏矩阵的那条线:my_matrix=scipy.sparse.lil_matrix(np.random.randint(2,size=(100000,100000)))这对我来说似乎有点不合理。如果值为0和1,您确实需要弄清楚如何切换到dtype=bool。这将节省大量内存。或者至少在这里切换到np.uint8.M2C,使用ulimit
增加进程可以从内核请求的内存量。第二,@JohnZwincknp.zero
可能不是检查您可以从内核获得的最大内存的好测试。从中看到答案