MemoryError,Killed

时间:2014-08-19 16:38:02

标签: python python-2.7 numpy

我正在尝试创建两个矩阵key_mat和c_mat c_mat最初是(1,847) fixd_len = 847

虽然数字不是0,我试图堆积key_mat和c_mat

所以这可能会成为一些(n,847)Col:1 - > Ñ

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

可能的位,该数字是最高可能的十进制数;

你开始划分>>按2,然后在同一个变量中分配。

注意这个快速的脏代码,没有分配严格的类型,并且重用了var;

动态重新分配大矩阵变量。

什么是占用记忆?

我不确定。

更新:我发现this很有趣。还在读它。

UPDATE2:以上更新提供了很好的见解(esp答案和评论)

如果有人能告诉我如何处理这个问题(847仍然不是很大)。你怎么解决记忆紧张的局面?将不胜感激..

2 个答案:

答案 0 :(得分:2)

我们假设n最初是255589106(是的,最糟糕的情况,但请耐心等待。)

你的循环每次都会减半n,并且由于log(255589106,2)〜= 27,你最终可能会循环约27次。每次循环,你都会将c_mat的大小加倍(也可能加倍key_mat - 不确定)。如果c_mat仅以847字节开始,经过27次加倍后,它将是(847 * 2 ** 27)字节大小...或超过100Gigs。这甚至不包括k_mat的大小。

我不确定你的程序在做什么,但看起来它只是试图在内存中做太多。

答案 1 :(得分:0)

现在它正在运作。

我检查了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))

问题已解决。