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)
Короче говоря, многопроцессорная не собирается, чтобы помочь вам читать данные из файла, но это может ускорить время, необходимое вам для обработки этих данных.
Возможно, вам это полезно: http://stackoverflow.com/questions/18104481/read-large-file-in-parallel – FacundoGFlores
Что вы делаете для каждой части данных? В зависимости от того, что вы делаете, ваша проблема связана с привязкой ввода/вывода, а не с привязкой к ЦП, и поэтому вы не получите ускорения от многопроцессорной обработки. –
Причина для downvote: ваш вопрос не о многопроцессорности вообще. –