Многопроцессорность и библиотека Python Concurrent.futures (не работает на Google Compute Engine) - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь распараллелить операцию pandas, которая разбивает столбец данных с разделенными запятыми значениями на 2 столбца.Обычная операция pandas занимает около 5 секунд на моем экземпляре python, который напрямую использует df.str.split в этом конкретном столбце.Мой фрейм данных содержит 2 миллиона строк, и поэтому я пытаюсь сократить время выполнения кода.

В качестве первого подхода к распараллеливанию я использую многопроцессорную библиотеку Python, создавая пулы, эквивалентные количеству ядер ЦП, доступных намой экземпляр.Для второго подхода к той же проблеме я использую библиотеку concurrent.futures, упомянув chunksize из 4. Однако я вижу, что многопроцессорная библиотека занимает примерно то же время, что и обычная операция pandas (5 секунд), тогда как concurrent.futures занимает больше минуты, чтобы запустить ту же строку.

1) Поддерживает ли Google Compute Engine эти многопроцессорные библиотеки Python?2) Почему параллельная обработка не работает на GCP?

Заранее спасибо.Ниже приведен пример кода:

import pandas as pd
from multiprocessing import Pool

def split(e):
    return e.split(",")

df =  pd.DataFrame({'XYZ':['CAT,DOG', 
      'CAT,DOG','CAT,DOG']})

pool = Pool(4)
df_new = pd.DataFrame(pool.map(split, df['XYZ'], columns = ['a','b'])
df_new = pd.concat([df, df_new], axis=1)

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

df['a'], df['b'] = df['XYZ'].str.split(',',1).str

Uisngconcurrent.futures:

import concurrent.futures
with concurrent.futures.ProcessPoolExecutor() as pool:
     a = pd.DataFrame(pool.map(split, df['XYZ'], chunksize = 4), 
     columns=['a','b'])
print (a)

Приведенный выше код с использованием concurrent.futures занимает больше минуты для запуска на GCP.Обратите внимание, что код, который я разместил, является просто примером кода.Фрейм данных, который я использую в проекте, содержит 2 миллиона таких строк.Любая помощь будет очень признателен!

1 Ответ

0 голосов
/ 18 февраля 2019

Почему вы выбрали chunksize=4?Это довольно мало, для 2 миллионов строк это разбило бы его на 500 000 операций.Общее время выполнения может занять только 1/4 времени, но дополнительные издержки, вероятно, сделают это дольше, чем однопоточный подход.

Я бы порекомендовал использовать намного больший chunksize.В любом месте может быть уместно от 10 000 до 200 000, но вы должны настроить это, основываясь на некоторых экспериментах с полученными результатами.

...