Чи породжуються дочірні процеси за допомогою багатопроцесорної обробки об'єктів спільного використання, створених раніше в програмі?
У мене є така настройка:
do_some_processing(filename):
for line in file(filename):
if line.split(',')[0] in big_lookup_object:
# something here
if __name__ == '__main__':
big_lookup_object = marshal.load('file.bin')
pool = Pool(processes=4)
print pool.map(do_some_processing, glob.glob('*.data'))
Я завантажую в пам'ять якийсь великий об'єкт, потім створюю пул працівників, які повинні використовувати цей великий об'єкт. Доступ до великого об'єкта доступний лише для читання, мені не потрібно передавати його модифікації між процесами.
Моє запитання: чи великий об'єкт завантажується в спільну пам'ять, як це було б, якби я породив процес в unix / c, чи кожен процес завантажує власну копію великого об'єкта?
Оновлення: для подальшого уточнення - big_lookup_object - це об'єкт спільного пошуку. Мені не потрібно це розділяти і обробляти окремо. Мені потрібно зберегти єдину його копію. Робота, яку мені потрібно розділити, - це читання багатьох інших великих файлів і пошук елементів у цих великих файлах проти об’єкта пошуку.
Подальше оновлення: база даних - це прекрасне рішення, складене схоже може бути кращим рішенням, а файл на диску (полиці або dbm) може бути ще кращим. У цьому питанні мене особливо зацікавило рішення щодо пам’яті. Для остаточного рішення я буду використовувати hadoop, але я хотів побачити, чи можу я також мати локальну версію в пам'яті.
marshal.load
батьків та кожної дитини (кожен процес імпортує модуль).