2014-10-02 4 views
2

В качестве примера, скажем, у нас есть 3 CSV файлы с миллионами строк в файле:Python обработки нескольких файлов

file_1.csv contains 10 million lines 
file_2.csv contains 2.5 million lines 
file_3.csv contains 7.1 million lines 

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

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

Process 1 
    file_1.csv being processed 
    thread 1 is processing the first 1 million lines 
    thread 2 is processing the second 1 million lines 
    etc… 
    combine thread results 

... и так далее для процесса 2 и 3.

Итак, мой вопрос, что это самый быстрый способ обработки этих файлов?

+1

Это зависит от того, какую обработку вы делаете и какие другие детали. Трудно сказать, какой из них быстрее, без запуска кода и измерения времени. – kraskevich

+0

Точно, что @ user2040251 сказал: * Это зависит *. Нам нужен больше контекста, например: какова ваша текущая граница сейчас, процессор или IO? Проанализируйте выполнение, чтобы определить, какие самые медленные части есть, и только затем сделайте эти цели оптимизации. – smassey

ответ

4

Использование потоков для обработки частей файла не улучшит производительность вообще (при условии, что вы используете CPython), из-за Global Interpreter Lock. Только один поток может запускать байт-код Python за раз, поэтому в любое время ваши потоки должны делать что-то другое, кроме блокировки ввода-вывода, только один поток может запускаться одновременно. Таким образом, вы в конечном итоге по существу обрабатываете файл последовательно, только с дополнительными служебными данными, вызванными переключением между потоками.

Итак, из двух вариантов, с которыми вы столкнулись, первый будет работать лучше. Тем не менее, вы можете потенциально повысить производительность, если в вашей системе имеется более 3 ядер процессора, разбивая файлы так, чтобы каждое доступное ядро ​​в вашей системе обрабатывало кусок файла в собственном процессе (и, следовательно, избегало GIL) , Лучший способ сделать это зависит от того, какую обработку вы делаете для каждого файла csv. Вы помещаете данные из csv в структуру данных в памяти? Выполнение каких-либо расчетов по каждой строке? И т. Д.

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