Python列表处理期间的MemoryError
(Python版本2.6.5) 我有:Python列表处理期间的MemoryError,python,list,memory,pickle,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、相对大
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、相对大小]
我有一种“切碎”的方法:
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
基本上,一个“盒子”根据其“相对大小”被“切碎”成相等的段,并添加到列表中
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”。有什么问题?我需要pickle我的列表还是我的列表输出?提前谢谢 为每个项目创建一个包含
6*除法因子**3
元素的列表(box\u out
),并为每个输入元素创建列表。即使使用division\u factor
=2,您的数据大小也增加了48倍。我不知道你有多少内存,但可能还不够
- 尝试使用数组;它们更紧凑、更高效,可能足以将数据放入RAM中
- 尝试使用数据库,例如SQLite,并将数据存储在磁盘上。您的算法看起来是顺序的,似乎不需要同时在RAM中存储所有数据
- 买一台更大的机器:)不,真的,租用一台高内存EC2实例的费用是每小时0.5到1.5美元,而且这些都有足够的内存