2013-03-05 47 views
3

我經常遇到問題,我想快速地對一組很多對象做簡單的事情。我自然選擇使用IPython Parallel來簡化它,但我經常需要處理不可取的對象。在嘗試幾個小時後,我通常會自己辭職,讓我在一臺計算機上過夜,或者做一件愚蠢的事情,比如將事情分成半手動方式運行在多個Python腳本中。使用IPython並行(或其他包)取決於不可取的對象的可伸縮並行任務

舉一個具體的例子,假設我想刪除給定S3存儲桶中的所有密鑰。

什麼我通常離不開思路是:

import boto 
from IPython.parallel import Client 

connection = boto.connect_s3(awskey, awssec) 
bucket = connection.get_bucket('mybucket') 

client = Client() 
loadbalancer = c.load_balanced_view() 

keyList = list(bucket.list()) 
loadbalancer.map(lambda key: key.delete(), keyList) 

的問題是,Key對象boto是unpickable(*)。這對我來說經常發生在不同的環境中。對於多處理,execnet以及我嘗試過的所有其他框架和庫,這也是一個問題(原因很明顯:它們都使用相同的pickler來序列化對象)。

你們是否也有這些問題?有沒有一種方法可以序列化這些更復雜的對象?我是否必須爲這些特定對象編寫自己的pickler?如果我這樣做,我該如何告訴IPython Parallel使用它?我如何寫一個pickler?

謝謝!


(*)我知道,我可以簡單地做鑰匙的名單,做這樣的事情:

loadbalancer.map(lambda keyname: getKey(keyname).delete()) 

,並在IPython的集羣中的每個引擎定義getKey功能。這只是我經常發現的一個更普遍問題的一個特例。也許這是一個不好的例子,因爲它可以通過其他方式輕鬆解決。

+2

我敢肯定,任務沒有你取笑他們對SO足夠的尷尬! – 2013-03-05 15:23:11

回答

0

IPython肯定會把人們聚集在一起;)。所以從我所能收集到的東西,酸洗物體的問題就是他們的方法。所以也許不使用key的方法來刪除它,你可以編寫一個函數來接受並刪除它。也許首先得到每個鍵的相關信息的dict的列表,然後調用函數delete_key(dict),我留給你寫,因爲我不知道如何處理s3鍵。

會這樣嗎?


或者,它可能是這樣的:簡單地而不是調用實例的方法,調用類實例的方法作爲參數。所以,而不是lambda key : key.delete()你會做lambda key : Key.delete(key)。當然,你必須將課程推到節點上,但這不應該是一個問題。小例子:

class stuff(object): 
     def __init__(self,a=1): 
      self.list = [] 
     def append(self, a): 
      self.list.append(a) 

    import IPython.parallel as p 
    c = p.Client() 
    dview = c[:] 

    li = map(stuff, [[]]*10) # creates 10 stuff instances 

    dview.map(lambda x : x.append(1), li) # should append 1 to all lists, but fails 

    dview.push({'stuff':stuff}) # push the class to the engines 
    dview.map(lambda x : stuff.append(x,1), li) # this works.