内存错误,被杀死
Posted
技术标签:
【中文标题】内存错误,被杀死【英文标题】:MemoryError, Killed 【发布时间】:2014-08-19 16:38:01 【问题描述】:我正在尝试创建两个矩阵 key_mat 和 c_mat c_mat 最初是 (1,847) fixd_len = 847
虽然数字不是0,但我试图把key_mat和c_mat叠加起来
所以这可能变成 some(n,847) Col :1 --> n
key_mat 和 c_mat 的 Cols 中的每个元素都是 1 或 0 int 类型;
它不是点积.. 特别是我需要按位,所以我正在做元素操作;
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))
这会大大增加内存吗?
我想 c_mat 和 key_mat 位于共享 RAM 内存中,并且 key_mat 和 c_mat 分配发生在那里而不是缓存。
我在 VPS 和我的核心 i7、8Gb Win 8 机器上运行它;
PS:考虑 847 位位置..
938439603600587528746394711938657107663969949193687942084737423845328945327403963493426274822541422606069252398088182827397836333287780407720182613329988145004965865323862822167078543736143176539997470989737828269291292380585577139908076735904949708259328L P>
可能的位数,并且该数字是可能的最高十进制数;
您开始将 >> 除以 2,然后在同一个变量中重新赋值。
注意这个快速的 n 脏代码,没有分配严格的类型并且 var 被重用;
动态重新分配大矩阵变量。
什么在占用内存??
我不确定。
更新:我发现this 很有趣。还在读。
UPDATE2:上述更新提供了很好的见解(尤其是答案和 cmets)
如果有人能告诉我如何解决这个问题(847 仍然不是很大)。你如何在这里解决内存紧张的情况?不胜感激。。
【问题讨论】:
我不确定你的代码在做什么(字符串连接和连接不能愉快地与 numpy 混合),但我相信在 Win8 中每个进程仍然限制为 4GB。 @mdurant Ubuntu 64 位抛出 Process Killed 怎么样?? @mdurant:64 位 Windows 限制为 8TB (msdn.microsoft.com/en-us/library/windows/desktop/…) 好吧,c_mat 仅是 1 和 0 元素的 (1,847) 列;对 key_mat 做同样的事情;number
最初是什么?
【参考方案1】:
让我们假设 n
最初是 255589106(是的,最坏的情况,但请耐心等待)。
您的循环每次都将 n
减半,并且由于 log(255589106, 2) ~= 27,您最终可能会循环大约 27 次。每次通过循环时,您都会将 c_mat
的大小加倍(也可能会加倍 key_mat
- 不确定)。如果c_mat
开始时只有 847 字节,在 27 次加倍之后,它的大小将是 (847 * 2**27) 字节......或超过 100Gigs。这甚至不包括 k_mat 的大小。
我不确定你的程序在做什么,但看起来它只是试图在内存中做太多事情。
【讨论】:
847 * 2**27。有趣的备忘录分析;仅 c_mat 就占用了超过 1xx Gigs!所以不要堆积起来,做 someoperation(c_mat,k_mat) as (1,847) 27 次听起来更可行? some_operation 是异或运算 int = 4 个字节。它实际上是 (847 * 4)* (2**27) - 454729662464 字节 ~ 454.7 Gb【参考方案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))
问题已解决。
【讨论】:
以上是关于内存错误,被杀死的主要内容,如果未能解决你的问题,请参考以下文章