У меня есть программа, которая обрабатывает много данных (ГБс). Чтобы сделать это быстрее, я решил попробовать многопроцессорность.
Проблема в том, что многопроцессорная обработка копирует данные, а это невозможно в моем коде из-за большого объема данных. Мои функции используют много глобальных переменных, но только для чтения . Я просто хочу распараллелить один из них.
Эти функции получают список названий акций и используют их для доступа к фрейму данных pandas, который хранится в формате, подобном: frame=my_dict[stock_name]
. Поэтому я хочу разбить мой список громких имен на 12 подсписков (6 ядер процессора для 12 процессов) и вызывать эту конкретную функцию для каждого из 12 подсписков одновременно.
Поэтому я спрашиваю, есть ли способ использовать разделяемую память, и когда я использую ключевое слово global, каждый отдельный процесс может получить доступ к этим данным? Или, по крайней мере, я могу сделать это только для моего большого словаря, который содержит мои фреймы данных?
Это функция:
def find_something2(threl=2.0, my_limit=150, far=365, mystocks=None):
""" Find stocks tha are worth buying"""
global current_date, total_money, reduced_stocks
worthing = list()
for stock in mystocks:
frame = reduced_stocks[stock]
temp = frame.loc[current_date:end_date]
if not temp.empty:
mydate = temp.head(far).Low.idxmin()
my_min = temp.head(far).Low.min()
if total_money >= my_min > 0: # find the min date at four months
ans, res, when_sell, total, income = worth_buy(stock, frame, mydate, 'Low',
thres=threl, sell_limit=my_limit)
if ans:
if income > 3 * 10 ** 6:
worthing.append([mydate, stock, res, when_sell, total, income])
Reduced_stocks - это указание, которое я упомянул выше
Эта функция и вызываемая ею функция worth_buy не вносят никаких изменений в сохраненнуюданные, он просто возвращает некоторые результаты.
Я также пробовал многопоточность, но из-за глобальной блокировки интерпретатора (GIL) он не работал быстрее, чем последовательная версия
Я использую Windows64-битная система
Заранее спасибо.