Проблемы с работой многопроцессорной библиотеки Python при использовании функции процесса - PullRequest
0 голосов
/ 09 сентября 2018

Я пытаюсь создать список пар родитель / комментарий из общедоступного набора данных Reddit.

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

import os
import multiprocessing as mp
import numpy as np 
import pandas as pd

sourcePATH = r'C:\'
workingFILE = r'\output-pt1.csv'

# filepaths

input_file = sourcePATH + workingFILE

data_df = pd.read_csv(input_file,header=None,names=['PostIDX','ParentIDX','Comment','Score','Controversiality'])

Цель состоит в том, чтобы просмотреть каждую строку в кадре данных и использовать родительский идентификатор для поиска по оставшейся части кадра данных, чтобы увидеть, присутствует ли их родительский комментарий. Если это так, я сохраняю комментарии детей и родителей в кортеже с некоторой другой информацией. Затем он будет добавлен в список, который в конце будет записан в CSV-файл. Для этого я использую следующий код:

def checkChildParent(ParentIDX_curr, ChildIDX_curr,ChildComment_curr,ChildScore_curr,ChildCont_curr):

    idx = data_df.loc[data_df['PostIDX'] == ParentIDX_curr]

    if idx.empty is False:
        ParentComment = idx.iloc[0,2]
        ParentScore = idx.iloc[0,3]
        ParentCont = idx.iloc[0,4]
        outPut.put([ParentIDX_curr[0], ParentComment,ParentScore,ParentCont,ChildIDX_curr[0], ChildComment_curr[0],ChildScore_curr[0],ChildCont_curr[0]])


if __name__ == '__main__':
    print('Process started')
    t_start_init = time.time()
    t_start = time.time()

    noCores = 1

    #pool = mp.Pool(processes=noCores)

    update_freq = 100
    n = 1000
    #n = round(len(data_df)/8)
    flag_create = 0
    flag_run = 0
    i = 0
    outPut = mp.Queue()

    #parent_child_df = pd.DataFrame()
    #parent_child_df.coumns = ['PostIDX','ParentIDX']


    while i < n:
        #print(i)
        procs = []
        ParentIDX = []
        ParentComment = []
        ParentScore = []
        ParentCont = []
        ChildIDX = []
        ChildComment = []
        ChildScore = []
        ChildCont = []

        for worker in range(0,noCores):
            ParentIDX.append(data_df.iloc[i,1])
            ChildIDX.append(data_df.iloc[i,0])
            ChildComment.append(data_df.iloc[i,2])
            ChildScore.append(data_df.iloc[i,3])
            ChildCont.append(data_df.iloc[i,4])
            i = i + 1

        #when I call the function this way it returns the expected matches
        #checkChildParent(ParentIDX,ChildIDX,ChildComment,
        #      ChildScore,ChildCont)


        #when I call the function with Process function nothing appears to be happening
        for proc in range(0,noCores):
            p = mp.Process(target = checkChildParent, args=(ParentIDX[proc],ChildIDX[proc],ChildComment[proc],ChildScore[proc],ChildCont[proc]))
            procs.append(p)
            p.start()

        #for p in procs:
        #    p.join()

        if outPut.empty() is False:
            print(outPut.get())

В верхней части файла находится функция, которая сканирует кадр данных для заданной строки и возвращает кортеж совпавшего родительского и дочернего комментария, если он был найден. Если я вызываю эту функцию нормально, тогда она работает нормально, однако, когда я вызываю функцию с использованием функции Process, она ничего не соответствует !. Я предполагаю, что это форма, в которой аргументы, которые передаются в функцию, передаются в функцию, которая вызывает проблему, но я пытался отладить это весь день и до сих пор не получилось. Если у кого-то есть предложения, пожалуйста, дайте мне знать!

Спасибо!

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