Есть ли способ поделиться огромным словарем для многопроцессорных подпроцессов на windows без дублирования всей памяти? Мне это нужно только для чтения внутри подпроцессов, если это помогает.
Моя программа выглядит примерно так:
def workerFunc(args):
id, data_mp, some_more_args = args
# Do some logic
# Parse some files on the disk
# and access some random keys from data_mp which are only known after parsing those files on disk ...
some_keys = [some_random_ids...]
# Do something with
do_something = [data_mp[x] for x in some_keys]
return do_something
if __name__ == "__main__":
multiprocessing.freeze_support() # Using this script as a PyInstalled .exe later on ...
DATA = readpickle('my_pickle.pkl') # my_pickle.pkl is huge, ~1GB
# DATA looks like this:
# {1: ['some text', SOME_1D_OR_2D_LIST...[[1,2,3], [123...]]],
# 2: ...,
# 3: ..., ...,
# 1 million keys... }
# Here I'm doing something with DATA in the main programm...
# Then I want to spawn N multiprocessing subprocesses, each doing some logic and than accessing a few keys of DATA to read from ...
manager = multiprocessing.Manager()
data_mp = manager.dict(DATA) # Right now I'm putting DATA into the shared memory... so it effectively duplicates the required memory...
joblist = []
for idx in range(10000): # Generate the workers, pass the shared memory link data_mp to each worker later on ...
joblist.append((idx, data_mp, some_more_args))
# Start Pool of Procs...
p = multiprocessing.Pool()
returnNodes = []
for ret in p.imap_unordered(workerFunc, jobList):
returnNodes.append(ret)
# Do some after work with DATA and returnNodes...
# and generate some overview xls-file out of it
К сожалению, нет другого способа сохранить мой большой словарь ... Я знаю, что SQL База данных будет лучше, потому что каждый работник имеет доступ только несколько ключей DATA_mp внутри его подпроцесса c, но я заранее не знаю, какие ключи будут адресованы каждым работником.
Поэтому мой вопрос: есть ли другой способ для windows сделать это вместо использования Manager.dict (), который, как уже было сказано выше, эффективно дублирует требуемую память?
Спасибо!
РЕДАКТИРОВАТЬ К сожалению, в моей корпоративной среде у моего инструмента нет возможности использовать SQL DB, потому что нет доступной выделенной машины. Я могу работать только на файловой основе на сетевых дисках. Я уже пробовал SQLite, но он был очень медленным (хотя я не понимал, почему ...). Да, это простой ключ-> значение типа словаря в DATA ...
И использование Python 2.7!