我正在尝试创建两个矩阵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仍然不是很大)。你怎么解决记忆紧张的局面?将不胜感激..
答案 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))
问题已解决。