Использование многопроцессорной обработки с общей памятью для больших глобальных данных - PullRequest
0 голосов
/ 24 октября 2019

У меня есть программа, которая обрабатывает много данных (ГБс). Чтобы сделать это быстрее, я решил попробовать многопроцессорность.

Проблема в том, что многопроцессорная обработка копирует данные, а это невозможно в моем коде из-за большого объема данных. Мои функции используют много глобальных переменных, но только для чтения . Я просто хочу распараллелить один из них.

Эти функции получают список названий акций и используют их для доступа к фрейму данных 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-битная система

Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...