разрешить травление объекта полки в python, pypar и mpich2 - PullRequest
1 голос
/ 11 марта 2011

У меня есть устаревший код Python, использующий pypar и mpich2 для передачи данных между несколькими узлами.По какой-то причине данные хранятся на полках, и Pypar хочет засолить полку, чтобы отправить ее на другие узлы.Мариновать полки не разрешается.Поэтому я хочу преобразовать из полки что-то, что я могу отправить через pypar, который обрабатывает его перед отправкой на другие узлы.Какие-либо предложения?Могу ли я преобразовать полку в JSON и засолить это?

Ответы [ 2 ]

1 голос
/ 11 марта 2011

предложение @ samplebias о преобразовании вашего объекта полки в dict сработает.

Однако, ( это может быть длинный выстрел, но ), учитывая, что ваши данные уже помещены в файл базы данных, возможно, стоит проверить, быстрее ли другие узлы загружать данные с полки файл вместо выполнения MPI отправляет. Я предполагаю, что все узлы имеют доступ к одной и той же файловой системе, поскольку вы запускаете их с использованием MPI.

Если честно, я ожидал бы, что передача MPI будет быстрее, особенно если вы работаете в системе с общей памятью, поскольку многие реализации MPI откатятся к копии памяти. Однако, если вы добавите накладные расходы на пересылку и открепление для отправки, гонка может быть близка!

Я подозреваю, что это будет связано с количеством узлов, на которых вы его выполняете, и вашим шаблоном связи.

1 голос
/ 11 марта 2011

Попробуйте преобразовать полку в dict() и затем выбрать ее:

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}}

Обновлено : (Ответ на вопрос в комментариях): dict может скопироватьзначения ключа из любого объекта сопоставления, поэтому, если этот объект реализует методы 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}

Обновление : вдобавить содержимое диктанта обратно на полку, используйте update():

d = {'a': 1, 'b': 2}
s = shelve.open('foo.db')
s.update(d)
print s
{'a': 1, 'b': 2}
...