内存错误,进程被杀死
我正在尝试创建两个矩阵,分别叫做 key_mat 和 c_mat。c_mat 一开始是 (1,847) 的形状,固定长度是 847。
只要数字不为 0,我就想把 key_mat 和 c_mat 堆叠起来。
这样就可以变成一个形状是 (n,847) 的矩阵,列数从 1 到 n。
key_mat 和 c_mat 中每个元素的值要么是 1,要么是 0,都是整数类型。
这不是点积,我需要的是按位运算,所以我在做逐元素操作。
number = int(''.join(map(str,key_mat.tolist()[0])),2)
#Build matrix of Keys
#print key_mat
#print c_mat
while number >= 0:
#Divide integer>> by 2 until it covers all rows
number >>= 1
key_mat = np.concatenate((key_mat, np.matrix(list((np.binary_repr(number)).zfill(fixd_len)), dtype=int)))
c_mat = np.concatenate((c_mat, c_mat))
这样做会大幅增加内存使用吗?
我想 key_mat 和 c_mat 是在共享的内存中,而它们的赋值也是在那儿进行,而不是在缓存中。
我在一个 VPS 上运行这个程序,同时也在我的电脑上运行,电脑是 i7 处理器,8GB 内存,系统是 Windows 8。
顺便提一下,考虑到 847 位的情况……
938439603600587528746394711938657107663969949193687942084737423845328945327403963493426274822541422606069252398088182827397836333287780407720182613329988145004965865323862822167078543736143176539997470989737828269291292380585577139908076735904949708259328L
这是可能的位数,而这个数字是最大的十进制数。
你开始用 >> 2 来进行除法,然后在同一个变量中重新赋值。
注意这个快速且简单的代码,没有严格的类型分配,变量是重复使用的。
大的矩阵变量是动态重新赋值的。
那么,是什么占用了内存呢?
我不太确定。
更新:我发现了 这个,很有意思,我还在继续阅读。
更新2:上面的更新给了我很好的见解(特别是回答和评论)。
如果有人能告诉我该如何处理这个问题(847 其实并不算大),在这里你会如何应对内存紧张的情况?我会很感激……
2 个回答
现在它可以正常工作了。
我检查了c_mat.shape和key_mat.shape,发现它们在每次循环时应该都是增加1行,但c_mat却是以2的c_mat.shape[0]次方的速度增加,因为c_mat在替换它的最后一个值。
最开始c_mat是通过c_mat = np.copy(C来创建的,我其实是想把c_mat和C拼接在一起。
现在它不是指数级增长,而是每次增加1行,列数线性增加。
number = int(''.join(map(str,key_mat.tolist()[0])),2)
#Build matrix of Keys
#print key_mat
#print c_mat
while number >= 0:
#Divide integer>> by 2 until it covers all rows
number >>= 1
key_mat = np.concatenate((key_mat, np.matrix(list((np.binary_repr(number)).zfill(fixd_len)), dtype=int)))
c_mat = np.concatenate((**Original_C**, c_mat))
问题已经解决。
假设一开始 n
是 255589106(是的,这个数字有点夸张,但请耐心看下去)。
你的循环每次都会把 n
减半,而根据计算,log(255589106, 2) 大约等于 27,这意味着你可能会循环大约 27 次。每次循环的时候,你都在把 c_mat
的大小翻倍(可能 key_mat
也在翻倍,但不太确定)。如果 c_mat
一开始只有 847 字节,经过 27 次翻倍后,它的大小将变成 (847 * 2**27) 字节,也就是超过 100G。这个计算还没算上 k_mat
的大小。
我不太清楚你的程序具体在做什么,但看起来它在内存中尝试处理的东西太多了。