Несколько кадров данных панд как параметры для многопроцессорной обработки - PullRequest
0 голосов
/ 28 августа 2018

Я немного новичок в Python, поэтому я хотел бы извиниться, если это такой глупый вопрос.

В настоящее время я работаю над разработкой для выполнения нескольких проверок данных.

Короче говоря, у меня есть основной фрейм данных, который необходимо будет сравнить с данными некоторых других фреймов данных.

Код, который я сделал, работает на одном ядре, но из-за тома мне потребуется реализовать многоядерную обработку. Проблема в том, что я не могу найти, как передать несколько кадров данных pandas в качестве аргументов в функциональный модуль.

Обратите внимание, что основной набор данных purchase_orders уже разделен между процессами, поэтому каждый из них получит 1/4 данных. Другие кадры данных должны быть меньше и точно такими же, поэтому, если есть способ сделать так, чтобы порожденный процесс имел доступ к фреймам данных, созданным в основном процессе, было бы хорошо, так как я буду только читать данные из них.

Dataframes change_log и параметры будут использоваться в методе apply.

Код ниже:

# this is the code I would like to call for multi processing
def apply_scores_test(purchase_orders, change_log, parameters):
    print('Running multicore')
    size = 1
    g_first = 'X'
    g_results = 'START'
    g_temp_lifnr = 'X'
    purchase_orders = purchase_orders.apply(calculate_scores, axis=1)
    return purchase_orders

# Starting the multi-core processing (locked to 4 process to make it easier to test)
p = multiprocessing.Pool(4) 
args = [(g_purchase_orders_1, change_log, parameters), (g_purchase_orders_2, change_log, parameters), (g_purchase_orders_3, change_log, parameters),(g_purchase_orders_4, change_log, parameters),]
res = p.map(apply_scores_test, args)
p.close()
p.join()

Ошибка, которую я сейчас получаю, заключается в том, что функциональный модуль получает только один аргумент, как показано ниже:

TypeError: apply_scores_test() missing 2 required positional arguments: 
'change_log' and 'parameters'

Кто-нибудь знает, как я могу передать 3 кадра данных панд функциональному модулю, когда я запускаю многопроцессорную работу?

ОБНОВЛЕНИЕ: Я попробовал еще несколько тестов, используя multiprocessing.pool.starmap вместо map, и я получаю ту же ошибку. Я также пытался использовать partial, но он не работает, так как мне нужно будет использовать хотя бы аргументы, и, насколько я понимаю, «частичный» работает только с 2 аргументами.

У кого-то есть какие-то другие идеи, в частности, с фреймами данных, я был бы очень признателен.

Заранее большое спасибо.

Bill

1 Ответ

0 голосов
/ 28 августа 2018

В связи с этим рассмотрите возможность перефакторинга вашего кода, используя starmap, инкапсулированный в менеджере контекста, with. Для Windows обязательно запустите многопроцессорную обработку внутри if __name__ == '__main__':

import multiprocessing
...

args = [(g_purchase_orders_1, change_log, parameters), 
        (g_purchase_orders_2, change_log, parameters), 
        (g_purchase_orders_3, change_log, parameters),
        (g_purchase_orders_4, change_log, parameters)]

if __name__ == '__main__':
    with multiprocessing.Pool(processes=4) as p:

        # LIST OF RETURNED DATAFRAMES
        results = p.starmap(apply_scores_test, args)

        # OUTPUT RESULTS
        for r in results:
            print(r)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...