如何在大小小于1MB的部分中拆分列表

问题描述:

我有一个由远程API调用返回的字典的排序列表(最终的响应小于4 MB)
我想将这个列表拆分成组块,其中MAX允许所得到的单个块的尺寸为1兆字节*如何在大小小于1MB的部分中拆分列表

所得块的列表需要保存的初始排序;这些块然后将被序列(通过泡菜)并投入不同Blob字段具有1 MB最大尺寸

什么是使用Python 2.5实现的最快代码?

*块的数目应该是适合的1Mb的约束

+1

[sys.getsizeof()](http://docs.python.org/library/sys.html#sys.getsizeof)仅在2.6及更高版本中受支持。 2.5中可能无法做到你想要的。 – 2010-11-10 00:19:35

+0

是否要将字典的内存大小设置为1MB或者您是否在查看某种序列化表示?你想保留大块的订单,或者你正在寻找一个最佳的包装?我会提前警告你,“Bin Packing”是一个NP难题的典型例子,所以追求最佳解决方案可能并不值得。 – 2010-11-10 01:01:05

+0

如果您的Python版本 2010-11-10 01:44:54

我找到了pympler库,asizeof模块为使用Python 2.2.3,2.3.7,2.4.5,2.5.1,2.5.2,2.6测试的一个或多个Python对象提供基本大小信息。

对我的评论跟进最低。您可以使用this extension。 和下面的脚本。假设这不会优化块的大小。它只是确保他们都不是比MAX

from sizeof import asizeof 

matrix=[] 
new_chunk = [] 
size_of_current_chunk = 0 
for x in your_sorted_list: 
    s = asize(x) 
    if size_of_current_chunk + s > MAX: 
     matrix.append(new_chunk) 
     size_of_current_chunk = 0 
     new_chunk = [] 
    size_of_chunk += s 
    new_chunk.append(x) 

if len(new_chunk): 
    matrix.append(new_chunk) 

元素matrix将包含对象的列表少于MAX在他们每个人的字节。

有趣的是,衡量asize的性能,仅仅对json字符串中的对象进行编码并将size字符串(char)与json字符串相乘。

+0

@systempuntoout如果您需要维护订单,那么我认为这个答案会提供一个可能的解决方案。顺序被保留,输出是一个列表,其中每个元素都是在矩阵的两个级别上保存顺序的块的列表。 – 2010-11-10 09:24:39

+0

+1的努力,但因为你测试的大小n次(我不知道asize函数的性能)它看起来很慢(我必须试试:))。 – systempuntoout 2010-11-10 11:07:22