2015-05-09 7 views
0

Я сделал сценарий, который читал строки файлов в строке, но у меня большой файл (32 ГБ), поэтому потребуется много времени.Понимание многопроцессорности Python

Здесь есть многопроцессорная обработка, чтобы сделать это быстрее, но я не очень хорошо понимаю эту функцию read_in_chunks, может кто-нибудь мне помочь?

Вот сценарий:

def read_in_chunks(file_object, chunk_size=1024): 
    """Lazy function (generator) to read a file piece by piece. 
    Default chunk size: 1k.""" 
    while True: 
     data = file_object.read(chunk_size) 
     if not data: 
      break 
     yield data 

f = open('teste.txt') 
for piece in read_in_chunks(f): 
    print piece 

Спасибо за все.

UPDATE К сожалению, я забыл сказать, что с линией я вставлю в

+0

Возможно, вам это полезно: http://stackoverflow.com/questions/18104481/read-large-file-in-parallel – FacundoGFlores

+1

Что вы делаете для каждой части данных? В зависимости от того, что вы делаете, ваша проблема связана с привязкой ввода/вывода, а не с привязкой к ЦП, и поэтому вы не получите ускорения от многопроцессорной обработки. –

+0

Причина для downvote: ваш вопрос не о многопроцессорности вообще. –

ответ

0

Вашего read_in_chunks функции MySQL DB просто дает вам объект генератора, который считывает файл кусок на куске. Ничего не происходит параллельно, и вы не увидите ускорения.

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

Я думаю, this answer дает хорошую общую картину при работе с большими файлами, которые вам помогут.

3

read_in_chunks - это функция, которая возвращает некоторое количество байтов, chunk_size, в файл. read_in_chinks является генератором и использует оператор yield, чтобы эти куски не сохранялись в памяти вашего компьютера, пока они не понадобятся. Вы говорите, что ваш скрипт читается «по очереди», и технически он читает «кусок» по «куску». Это различие может показаться педантичным, но важно отметить.

Чтение файла параллельно не даст вам каких-либо выигрышей в производительности. (Предполагая обычную настройку компьютера), на физическом жестком диске имеется только одна голова чтения-записи, поэтому буквально нет возможности, чтобы голова была в двух местах одновременно, считывая две части файла. Представьте, что ваши глазные яблоки пытаются, в то же время, читать сразу с двух страниц. Не произойдет. Таким образом, чтение файла известно как привязка ввода/вывода (привязка ввода/вывода), а Другие процессы не могут ускорить чтение файла.

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

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

Однако, если операция с данными была интенсивной, то, например, сложный алгоритм, который взял строку текстов и вычислил его оценку Вейсмана, было бы полезно многопроцессорное обслуживание.

Основной процесс будет читать большие куски данных и передавать каждый кусок в отдельный процесс. Каждый процесс будет вычислять счет Weismann данных, а затем возвращать эту информацию в основной процесс.

Вот некоторые псевдо-код:

def calc_weissman_score(chunk_of_data): 
    # a bunch of cpu intensive stuff here that take a lot of time 
    print 42 

f = open('teste.txt') 
gigabyte = 1000000000 
process_pool = 5 processes # use multiprocessing module for this 
for piece in read_in_chunks(f, chunk_size=gigabyte): 
    if there are not processes in the process pool: 
      wait until there are processes in the process pool 
     spawn a new process that calls calc_weissman_score(piece) 

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

+1

Хороший ответ. Просто хотелось добавить, что модуль ['multiprocessing'] (https://docs.python.org/3/library/multiprocessing.html) имеет [пул] (https://docs.python.org/3 /library/multiprocessing.html#multiprocessing.pool.Pool), который упрощает управление параллельными задачами. – JKillian

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