多くの非常に多くのオブジェクトのセットに対して簡単なことをすばやく実行したいという問題に遭遇することがよくあります。私の自然な選択は、単純化のために IPython Parallel を使用することですが、多くの場合、選択できないオブジェクトを処理する必要があります。数時間試した後、私は通常、1 台のコンピューターで一晩タスクを実行するか、複数の Python スクリプトで実行するために半手動で分割するなどの愚かなことを行います。
具体的な例を挙げると、特定の 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
が選択できない (*) ことです。これは、私にとってさまざまな状況で非常に頻繁に発生します。これは、マルチプロセッシング、execnet、および私が試した他のすべてのフレームワークとライブラリにも問題があります (明らかな理由で、それらはすべて同じ pickler を使用してオブジェクトをシリアル化します)。
皆さんもそんなお悩みありませんか?これらのより複雑なオブジェクトをシリアル化する方法はありますか? この特定のオブジェクトに対して独自の pickler を作成する必要がありますか? その場合、IPython Parallel にそれを使用するように指示するにはどうすればよいですか? ピッカーはどのように書くのですか?
ありがとう!
(*) キー名のリストを簡単に作成して、次のようにできることは承知しています。
loadbalancer.map(lambda keyname: getKey(keyname).delete())
getKey
IPython クラスターの各エンジンで関数を定義します。これは、私がよく目にする、より一般的な問題の特定の例にすぎません。別の方法で簡単に解決できるので、悪い例かもしれません。