1

我有一些使用 pypar 和 mpich2 在多个节点之间传输数据的遗留 python 代码。出于某种原因,数据保存在架子上,pypar 想要腌制架子以将其发送到其他节点。不允许酸洗货架。所以我想从搁置转换为我可以通过 pypar 发送的东西,它在发送到其他节点之前对其进行腌制。有什么建议么?我可以将搁置转换为 json 并腌制吗?

4

2 回答 2

1

尝试将搁置转换为 adict()然后对其进行酸洗:

sdb = shelve.open('foo.db')
sdb['abc'] = {'a': 1, 'b': 2}
tmp = cPickle.dumps(dict(sdb), 2)
print cPickle.loads(tmp)
{'abc': {'a': 1, 'b': 2}}

更新:(回复评论中的问题):Adict可以从任何映射对象复制键值,因此如果该对象实现了方法keys并且__getitem__它将起作用。由于搁置是一个映射对象,dict复制构造函数可以从搁置中读取键值,然后您可以腌制得到的字典并将其发送到其他主机。

下面的示例显示了dict复制对象所需的最小接口:

class Foo(object):

    def __init__(self):
        self.value = 0

    def keys(self):
        return ['a', 'b']

    def __getitem__(self, key):
        v = self.value
        self.value += 1
        return self.value

foo = Foo()
print dict(foo)
print dict(foo)

输出

{'a': 1, 'b': 2}
{'a': 3, 'b': 4}

更新:要将 dict 的内容添加回搁置,请使用update()

d = {'a': 1, 'b': 2}
s = shelve.open('foo.db')
s.update(d)
print s
{'a': 1, 'b': 2}
于 2011-03-11T03:49:57.933 回答
1

@samplebias将您的搁置对象转换为 dict 的建议将起作用。

但是,(这可能是一个长镜头,但是)考虑到您的数据已经搁置到 db 文件中,可能值得检查让其他节点从搁置文件中加载数据而不是执行 MPI 发送是否更快。我假设所有节点都可以访问相同的文件系统,因为您使用 MPI 运行它们。

老实说,我希望 MPI 发送速度更快,特别是如果您在共享内存系统上运行,因为许多 MPI 实现将回退到内存副本。但是,一旦您将发送的重新酸洗和取消酸洗的开销包括在内,比赛可能会很接近!

我怀疑这将取决于您运行它的节点数量以及您的通信模式。

于 2011-03-11T10:57:15.503 回答