2016-04-30 1 views
0

Я использую многопроцессорность в Python для распараллеливания. Я пытаюсь распараллелить процесс на кусках данных, прочитанных из файла excel, используя pandas.Многопроцессорство в python, несколько процессов, выполняющих те же инструкции

Я новичок в многопроцессорной и параллельной обработке. При реализации на простом коде,

import time; 
import os; 
from multiprocessing import Process 
import pandas as pd 
print os.getpid(); 
df = pd.read_csv('train.csv', sep=',',usecols=["POLYLINE"],iterator=True,chunksize=2); 
print "hello"; 
def my_function(chunk): 
    print chunk; 
count = 0; 
processes = []; 
for chunk in df: 
    if __name__ == '__main__': 
     p = Process(target=my_function,args=(chunk,)); 
     processes.append(p); 
    if(count==4): 
     break; 
    count = count + 1; 

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

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

enter image description here

ответ

2

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

Кстати, вы должны использовать Pool вместо Process es. Вот очистке пример:

import os 
import time 
from multiprocessing import Pool 

import pandas as pd 

NUM_PROCESSES = 4 


def process_chunk(chunk): 
    # do something 
    return chunk 


if __name__ == '__main__': 
    df = pd.read_csv('train.csv', sep=',', usecols=["POLYLINE"], iterator=True, chunksize=2) 
    pool = Pool(NUM_PROCESSES) 

    for result in pool.map(process_chunk, df): 
     print result 
0

Использование multiprocessing, вероятно, не собирается ускорить чтение данных с диска, так как доступ к диску гораздо медленнее, чем, например, Доступ к ОЗУ или вычисления. И разные фрагменты файла окажутся в разных процессах.

Использование mmapмогло бы помочь ускорить доступ к данным.

Если вы делаете только mmap данных файла данных до, начиная с, например, a Pool.map, каждый рабочий мог прочитать свой собственный фрагмент данных из файла с распределенной памятью и обработать его.