python - 令人尴尬的并行任务与 Python Parallel(或其他包)取决于不可拾取的对象

标签 python parallel-processing ipython ipython-parallel

我经常遇到这样的问题,即我想快速对一组很多很多对象做一些简单的事情。我的自然选择是使用 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/

相关文章:

python - Python 中的 all(map) 和 any(map) 输出 bool 值,但 IPython 中输出 true 映射对象

python - 更改IPython QtConsole的配置文件没有效果

python - Spyder、Python IDE 启动代码导致 GUI 崩溃

python - 如何替换Python字典中的二维列表值?

python - Pandas 日期时间格式不起作用 - python

python - 是否可以检查列表中的项目是否存在于变量中?

c# - 如何捕获一组任务的异常

bash - 并行运行两个连续的 bash 脚本 4 次

python - Django 事务锁定表

r - 我需要知道来自 R parallel socket cluster 的每个结果的任务号