我经常遇到这样的问题,即我想快速对一组很多很多对象做一些简单的事情。我的自然选择是使用 IPython Parallel,因为它很简单,但我经常不得不处理不可拾取的对象。尝试几个小时后,我通常会放弃自己,在一台计算机上通宵运行我的任务,或者做一些愚蠢的事情,比如半手动地划分东西以在多个 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)
问题是 boto
中的 Key
对象是不可拾取的 (*)。这对我来说经常发生在不同的环境中。多处理、execnet 以及我尝试过的所有其他框架和库也是一个问题(原因很明显:它们都使用相同的 pickler 来序列化对象)。
你们也有这些问题吗?有没有办法序列化这些更复杂的对象?我必须为这个特定对象编写自己的 pickler 吗?如果我这样做,我如何告诉 IPython Parallel 使用它?如何编写一个 pickler?
谢谢!
(*) 我知道我可以简单地列出键名并执行如下操作:
loadbalancer.map(lambda keyname: getKey(keyname).delete())
并在 IPython 集群的每个引擎中定义 getKey
函数。这只是我经常发现的更普遍问题的一个特例。也许这是一个不好的例子,因为它可以用另一种方式轻松解决。
最佳答案
IPython
有一个 use_dill
选项,如果你有 dill
安装序列化程序后,您可以序列化大多数“不可序列化”的对象。
How can I use dill instead of pickle with load_balanced_view
关于python - 令人尴尬的并行任务与 Python Parallel(或其他包)取决于不可拾取的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15227500/