2014-07-25 36 views
0

我正在使用boto將分佈式文件系統移動到aws simpledb中,而且我遇到了一個問題,它對我沒有明確的解決方案。我的代碼的當前狀態爲:根據內存大小拆分Python中的字典

def insert(documents): 
    data = {hash_doc(d): _decode(d) for d in documents if hash_doc(d)} 
    domain.batch_put_attributes(data) 

基本上是我打的問題是最多的batch_put_attributes功能提出AWS要求有1MB的最大尺寸。很明顯,我想盡量減少我所做的請求數量,但我也無法達到1MB的限制。

有什麼好的Python的方式從根本上說

拆分這個迭代成塊,從而均低於某一內存 大小,但數塊地

我覺得有點不包括更多的代碼,但我只是沒有找到一個可以處理這個問題的東西,我覺得應該有一個非常簡單的解決方案。

+0

我不能想到一個簡單的解決方案。但是你是否嘗試過使用sys.getsizeof(VAR_NAME)來嘗試自己完成分塊? –

回答

0

也許這樣做以下預處理這一點:

size_d = defaultdict(list) 
for k,v in data.items(): 
    size_d[sys.getsizeof(v)].append(v) 

然後,只需做一個函數來填補項目的1MB桶,彈出你決定任何項目來發送你不重用它。可以通過按大小對項目進行排序來優化它。很確定這是knapsack problem所以如果你找到一個最佳的解決方案,讓我們都知道:)

+0

不太有揹包問題,而這個答案有些誤解了這個問題。這裏有一個約束,每個請求中的項目必須按順序出現。這是自適應的,但順序列表塊,而不是揹包問題。 –

+0

我的不好。誤解了順序方面。你的意思是順序限制是針對你的具體問題的,你需要上傳塊,這樣你纔不會在idx 105之前上傳idx 200的項目? – BWStearns

+0

這是絕對正確的。 –