Python: передать Readonly Shelve подпроцессам - PullRequest
1 голос
/ 11 марта 2020

Как обсуждалось здесь: 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 об этом?

Спасибо!

...