2010-11-10 126 views
2

我有一個由遠程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版本<2.6,那麼可以查看http://code.activestate.com/recipes/546530/以獲取Python中對象的大小。 – 2010-11-10 01:44:54

回答

0

我找到了pympler庫,asizeof模塊爲使用Python 2.2.3,2.3.7,2.4.5,2.5.1,2.5.2,2.6測試的一個或多個Python對象提供基本大小信息。

1

對我的評論跟進最低。您可以使用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

相關問題