Python列表处理期间的MemoryError

时间:2013-05-15 09:24:22

标签: python list memory pickle

(Python版本2.6.5)

我有:

 boxes_with_sizes_added = [\
 [0,0,0,1,1,1,0],\
 [785,500,200,787,502,202,1],\
 [400,500,600,404,504,604,2],\
 [100,200,300,108,208,308,3],\
 [50,60,70,51,61,71,0]\
 # several millions more...
 ]

......它们是格式的框:[x1,y1,z1,x2,y2,z2,rel_size]

我有一个'斩波'的方法:

def cubic_breakdown(box,division_factor):
 if division_factor==1:
     return[box]
 elif division_factor>1:
     boxes_out=[]
     for k in range(division_factor):
         for j in range(division_factor):
             for i in range(division_factor):
                 boxes_out.append([\
                 (box[0]+((box[3]-box[0])/float(division_factor))*i),\
                 (box[1]+((box[4]-box[1])/float(division_factor))*j),\
                 (box[2]+((box[5]-box[2])/float(division_factor))*k),\
                 (box[0]+((box[3]-box[0])/float(division_factor))*(i+1)),\
                 (box[1]+((box[4]-box[1])/float(division_factor))*(j+1)),\
                 (box[2]+((box[5]-box[2])/float(division_factor))*(k+1)),\
                 box[6]\
                 ])
     return boxes_out

根据它的“rel_size”将“盒子”基本上“切成”成相等的片段并添加到列表中

 chopped_boxes=[]
 for box in boxes_with_sizes_added:
     for chopped_box in cubic_breakdown(box,2**box[6]):
         chopped_boxes.append(chopped_box)

但是,当我尝试处理太多的盒子时,我会在某个时刻遇到“MemoryError”。问题是什么?我是否需要挑选我的列表或列表输出?提前谢谢!

1 个答案:

答案 0 :(得分:0)

对于每个项目,您创建一个包含boxes_out元素的列表(6 * division_factor ** 3),并为输入的每个元素执行此操作。即使division_factor = 2,您的数据大小也会增加48倍。我不知道你有多少内存,但可能还不够。

  • 尝试使用numpy数组;这些更紧凑,更高效,可能足以使您的数据适合RAM。
  • 尝试使用数据库,例如SQLite,并将数据存储在磁盘上。您的算法看起来是连续的,您似乎不需要同时在RAM中的所有数据。
  • 获得更大的机器:)不,真的,租用高内存的EC2实例每小时0.5到1.5美元,而且这些内存充足。