【问题标题】:MemoryError during Python list processingPython列表处理期间的MemoryError
【发布时间】:2013-05-15 09:24:22
【问题描述】:

(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”。问题是什么?我需要腌制我的列表或列表输出吗?提前致谢!

【问题讨论】:

  • jfyi,你不需要所有这些在行尾的 ``s。试试看,读起来更轻松。

标签: python list memory pickle


【解决方案1】:

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

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

【讨论】:

  • 谢谢 9000...关于使用 SQLite 的任何建议?不幸的是 numpy 不是一个选择。写入数据库将如何实现?
  • ...或使用搁置?有人会推荐这个吗?
猜你喜欢
  • 2019-01-25
  • 2017-06-22
  • 1970-01-01
  • 2015-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多