Эффективно ли консолидировать результаты параллельного исполнения concurrent.futures? - PullRequest
0 голосов
/ 30 октября 2018

У меня есть кадр данных панд около 100M строк. Параллельная обработка работает очень хорошо на многоядерной машине со 100% использованием каждого ядра. Однако результаты executor.map() являются генератором, поэтому для фактического сбора обработанных результатов я перебираю этот генератор. Это очень, очень медленно (часы), частично потому что это одно ядро, частично из-за цикла. На самом деле, это намного медленнее, чем фактическая обработка в my_function()

Есть ли лучший способ (возможно, одновременный и / или векторизованный)?

РЕДАКТИРОВАТЬ: Использование панд 0.23.4 (последний на данный момент) с Python 3.7.0

import concurrent
import pandas as pd

df = pd.DataFrame({'col1': [], 'col2': [], 'col3': []})

with concurrent.futures.ProcessPoolExecutor() as executor:
    gen = executor.map(my_function, list_of_values, chunksize=1000)

# the following is single-threaded and also very slow
for x in gen:
    df = pd.concat([df, x])  # anything better than doing this?
return df

1 Ответ

0 голосов
/ 30 октября 2018

Вот тест, связанный с вашим делом: https://stackoverflow.com/a/31713471/5588279

Как видите, concat (append) несколько раз очень неэффективен. Вы должны просто сделать pd.concat(gen). Я полагаю, что реализация underlyig предварительно выделит всю необходимую память.

В вашем случае выделение памяти выполняется каждый раз.

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