Предварительная обработка данных с использованием многопроцессорного пула

Я использую Pandas dataframe для предварительной обработки больших данных (10 миллионов). Вместо того, чтобы получать все за раз, я пытаюсь получить данные несколько раз и пытаюсь использовать мультипроцессорную обработку за раз. Для теста в курсорах 10000 строк, и выберите 1000 за раз:

for i in range(loop_num): # loop_num=10
    begin_time = time.time()
    rows = cursor.fetchmany(1000)  # get 1000 for a time
    end_time1 = time.time()
    print("cost %.2f seconds fetching data for No%d time" % (end_time1-begin_time, i))

    # data preprocessing
    print("preprocessing data for one time...")
    p = Pool(5)  # use multiprocessing
    results = []
    tasks_num = 10
    rows_num = int(math.ceil(1000 / tasks_num)) # rows in each subprocess

    for j in range(tasks_num):
        row = rows[(j * rows_num):((j + 1) * rows_num)]
        print("get %d rows" % len(row))
        # save preprocessed data in results
        results.append(p.apply_async(onetime_clean, args=(table_cols, row, predict_month), error_callback=bar))

    print('Waiting for all subprocesses done...')
    p.close()
    p.join()
    df_nps_sca = pd.DataFrame(columns=results[0].get().columns.tolist())

    # get the result as a dataframe
    for m in range(len(results)):
        df_nps_sca = df_nps_sca.append(results[m].get(),ignore_index=True, sort=False)
    print(df_nps_sca.shape)
    end_time_per = time.time()
    print("cost %.2f seconds NO%d time" % (end_time_per-begin_time, i))
# end for
print("data preprocessing finished!")
conn.close()

А вот моя функция onetime_clean:

def onetime_clean(table_cols, rows, predict_month):
    num_columns = ['AGE', 'DURATION', 'ENTERTAINMENT', 'SOCIALITY', 'LIFE']
    scene_columns = ['SCENIC_SCENE', 'TRAFIC_SCENE','OFFICE_SCENE','PUBLIC_SCENE']

    # change rows into dataframe
    df_nps = pd.DataFrame(rows, columns=table_cols)
    # call another function which just do some transfer
    df_nps = data_transfer(df_nps)

    # load model imputer and scaler from training data
    sc_x = joblib.load('./sc_X.pkl')
    imputer = joblib.load('./imputer.pkl')

    # using imputer fillna  
    df_nps[num_columns] = imputer.transform(df_nps[num_columns])

    # scaler without the first col and change them into dataframe
    df_nps_sca = sc_x.transform(df_nps.iloc[:, 1:])  # got error this line
    df_nps_sca = pd.DataFrame(df_nps_sca, index=df_nps.index, columns=sca_cols)
    return df_nps_sca 

Когда я выполняю, у меня есть ошибки в некоторых подпроцессах (не во всех), в то время как остальные из них успешны:

failure: operands could not be broadcast together with shapes (100,62) (63,) (100,62)

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

кстати, если я не использую многопроцессорность, ошибки не будет.

Kamook 27.10.2018 04:46
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
199
0

Другие вопросы по теме