Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python列表处理期间的MemoryError_Python_List_Memory_Pickle - Fatal编程技术网

Python列表处理期间的MemoryError

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、相对大

(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、相对大小]

我有一种“切碎”的方法:

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美元,而且这些都有足够的内存

jfyi,您不需要在行尾添加所有这些``s。试试看,它读起来更简单。谢谢…关于使用SQLite有什么建议吗?不幸的是,numpy不是一个选项。如何实现对数据库的写入?…或使用shelve?有人推荐这个吗?