3

多くの非常に多くのオブジェクトのセットに対して簡単なことをすばやく実行したいという問題に遭遇することがよくあります。私の自然な選択は、単純化のために 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())

getKeyIPython クラスターの各エンジンで関数を定義します。これは、私がよく目にする、より一般的な問題の特定の例にすぎません。別の方法で簡単に解決できるので、悪い例かもしれません。

4

2 に答える 2

2

IPythonシリアライザーがインストールされている場合、ほとんどの「ピクルできない」オブジェクトをシリアライズできるuse_dillオプションがあります。dill

load_balanced_view でピクルの代わりにディルを使用するにはどうすればよいですか

于 2014-10-19T11:18:25.947 に答える
0

その IPython は確かに人々を結びつけます ;)。したがって、私が収集できたものから、オブジェクトをピクルする問題はその方法です。したがって、メソッドを使用しkeyて削除する代わりに、それを取得して削除する関数を作成できます。おそらく、最初に各キーの関連情報を含む のリストを取得してから、s3 キーの処理方法がわからないため、作成するのはあなたに任せるdict関数を呼び出します。delete_key( dict )

それはうまくいくでしょうか?


または、これが機能する可能性があります。単にインスタンスのメソッドを呼び出す代わりに、インスタンスを引数としてクラスのメソッドを呼び出します。だからあなたの代わりに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.
于 2013-10-23T12:25:30.690 に答える