Как обсуждалось здесь: Python: многопроцессорная обработка на Windows -> совместно используемая постоянная память У меня задача с сильным распараллеливанием.
Несколько рабочих делают кое-что и в конце концов нуждаются получить доступ к некоторым ключам словаря, который содержит несколько миллионов комбинаций ключ: значение. Ключи, к которым будет получен доступ, известны только внутри рабочего после некоторых дальнейших действий, также связанных с некоторой обработкой файлов (приведенный ниже пример только для демонстрационных целей, следовательно, упрощен таким образом).
Раньше мое решение состояло в том, чтобы сохранить этот большой словарь в памяти, передать его один раз в общую память и получить к нему доступ от одного работника. Но он потребляет много оперативной памяти ... Поэтому я хотел использовать полку (потому что значения этого словаря снова являются диктами или списками).
Итак, упрощенный пример того, что я пробовал, был:
def shelveWorker(tupArgs):
id, DB = tupArgs
return DB[id]
if __name__ == '__main__':
DB = shelve.open('file.db', flag='r', protocol=2)
joblist = []
for id in range(10000):
joblist.append((str(id), DB))
p = multiprocessing.Pool()
for returnValue in p.imap_unordered(shelveWorker, joblist):
# do something with returnValue
pass
p.close()
p.join()
К сожалению, я получаю:
«Ошибка типа: невозможно выбрать объекты БД»
Но ИМХО нет смысла открывать саму полку (DB = shelve.open('file.db', flag='r', protocol=2)
) внутри каждого рабочего по отдельности из-за более медленного времени выполнения (у меня несколько тысяч рабочих).
Как go об этом?
Спасибо!