Многопроцессорная обработка в Python с использованием пула - PullRequest
0 голосов
/ 27 мая 2018

Я хочу распараллелить функцию на фрейме данных, используя Python.Я видел учебники, и я нашел некоторый код. Я приспособил его к своим потребностям.Когда я выполняю функцию карты, программа зависает.Код кажется твердым.Интересно, в чем проблема.

import pandas as pd
import numpy as np
from multiprocessing import cpu_count, Pool

attributes1 = pd.read_csv('attributes1.csv')


def replace_data(data):
    for i in range(0, len(data.index)):
        temp = data.iloc[i, 1]
        temp = temp.replace('in.', 'inch')
        data.iloc[i, 1] = temp
    return data

num_partitions = 10 #number of partitions to split dataframe
num_cores = cpu_count() #number of cores on your machine

def parallelize_dataframe(df, func):
    df_split = np.array_split(df, num_partitions)
    pool = Pool(num_cores)
    df = pd.concat(pool.map(func, df_split))
    pool.close()
    pool.join()
    return df

df1 = parallelize_dataframe(attributes1, replace_data)

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Это проблема только для пользователей Windows.Сначала я создал еще один файл .py, назовем его helpy.py, где у меня есть функция replace_data

def replace_data(data):
    for i in range(0, len(data.index)):
        temp = data.iloc[i, 1]
        temp = temp.replace('in.', 'inch')
        data.iloc[i, 1] = temp
    return data

Затем я импортировал свою функцию в свой основной файл .py.

import pandas as pd
import numpy as np
from multiprocessing import cpu_count, Pool
from helpy import replace_data

attributes1 = pd.read_csv('attributes1.csv')


num_partitions = 10 #number of partitions to split dataframe
num_cores = cpu_count() #number of cores on your machine

    def parallelize_dataframe(df, func):
        df_split = np.array_split(df, num_partitions)
        pool = Pool(num_cores)
        df = pd.concat(pool.map(func, df_split))
        pool.close()
        pool.join()
        return df

    if __name__ == '__main__':
        df1 = parallelize_dataframe(attributes1, replace_data)

IТакже добавлено if __name__ == '__main__': Теперь программа работает без сбоев.

0 голосов
/ 27 мая 2018

Вы, вероятно, используете windows, для его исправления вам нужно freeze_support:

from multiprocessing cpu_count, Pool, freeze_support

...

if __name__ == '__main__':
    freeze_support()
    df1 = parallelize_dataframe(attributes1, replace_data)
...