2015-05-07 5 views
0

У меня есть 10 000 файлов csv, которые я должен открыть в Pandas, и манипулировать/преобразовывать с помощью некоторых функций Pandas и сохранять новый вывод в csv. Могу ли я использовать параллельный процесс (для Windows), чтобы сделать работу быстрее? Я попытался следующие, но не повезло:Параллельная обработка большого количества заданий

import pandas pd 
import multiprocessing 

def proc_file(file): 
    df = pd.read_csv(file) 
    df = df.reample('1S', how='sum') 
    df.to_csv('C:\\newfile.csv') 
if __name__ == '__main__':  
    files = ['C:\\file1.csv', ... 'C:\\file2.csv'] 

    for i in files: 
     p = multiprocessing.Process(target=proc_file(i)) 
    p.start() 

Я не думаю, что у меня есть хорошее понимание многопроцессорной в Python.

+0

По крайней мере, я думаю, что файлы и цикл for должны быть в главной функции: https://docs.python.org/2/library/multiprocessing .html # многопроцессорное программирование – TomAugspurger

+0

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

+2

Преимущества «многопроцессорности», возможно, несколько ограничены объемом ввода-вывода, требуемым для чтения всех CSV-файлов. Чтение с диска не может быть распараллелено с типичным дисководом, поэтому, если это окажется доминирующим в среде выполнения, «многопроцессорность» не поможет. На самом деле это может повредить, если ваш жесткий диск нуждается в постоянном поиске различных частей своего диска, чтобы одновременно читать многие файлы. – dano

ответ

1

Убедитесь, чтобы закрыть бассейн и позже:

import multiprocessing 

# Maximum number of cpus to use at a time 
max_threads = multiprocessing.cpu_count() - 1 

pool = multiprocessing.Pool(max_threads) 
list_files = pool.map(func,list_of_csvs) 
pool.close() 
pool.join() 

list_files может содержать список, например, вы можете вернуть имя измененного csv из func()

+0

Зачем мне закрывать и присоединяться к пулу? Если мне все равно, что я сохраняю каждый из своих файлов CSV через свою функцию 'def', действительно ли важно, чтобы я закрылся и присоединился? – Plug4

+0

просто чище, что указывает на то, что в очередь не будет помещено больше данных. – user308827

+1

@ user308827 'close' /' join' - хороший стиль, но это не имеет никакого отношения к поведению в этом случае; основные блоки процесса до тех пор, пока 'pool.map' не будет завершен, поэтому« Пул »просто прекратится, когда основной процесс закончится без каких-либо побочных эффектов. – dano

1

Может быть что-то вроде этого:

p = multiprocessing.Pool() 
p.map(prof_file, files) 

Для такого размера, что вам действительно нужно пул процесса, так что стоимость запуска процесса компенсируется работой он делает. multiprocessing.Pool делает именно это: он преобразует параллелизм задач (это то, что вы делали) в task parallelism.

+0

Я верю, что это сработает. Могу ли я указать количество работающих пользователей? Я вернусь к вам, если все будет хорошо. Спасибо @AmiTavory – Plug4

+0

'p = multi.Pool (процессы = 8)' Я верю ... – Plug4

Смежные вопросы