Это всего лишь гипотеза, но ваш процесс может тратить свое выделенное место на ЦП каждый раз, когда запускает ввод / вывод для получения пары строк. Вы можете попробовать читать группы строк одновременно и обрабатывать их по частям, чтобы вы могли максимально использовать каждый временной интервал ЦП, который вы получаете в общем кластере.
from collections import deque
chunkSize = 1000000 # number of characters in each chunk (you will need to adjust this)
chunk1 = deque([""]) #buffered lines from 1st file
chunk2 = deque([""]) #buffered lines from 2nd file
with open(file1, "r") as f1, open(file2, "r") as f2:
while chunk1 and chunk2:
line_f1 = chunk1.popleft()
if not chunk1:
line_f1,*more = (line_f1+file1.read(chunkSize)).split("\n")
chunk1.extend(more)
line_f2 = chunk2.popleft()
if not chunk2:
line_f2,*more = (line_f2+file2.read(chunkSize)).split("\n")
chunk2.extend(more)
# process line_f1, line_f2
....
То, как это работает, заключается в чтении фрагмента символов (который должен быть больше вашей самой длинной строки) и разбиении его на строки. Строки помещаются в очередь для обработки.
Поскольку размер фрагмента выражается в количестве символов, последняя строка в очереди может быть неполной.
Чтобы убедиться, что строки завершены перед обработкой, другой блок считывается, когда мы добираемся до последней строки в очереди. Дополнительные символы добавляются в конец незавершенной строки, и в объединенной строке выполняется разбиение строки. Поскольку мы конкатенировали последнюю (неполную) строку, функция .split("\n")
всегда применяется к фрагменту текста, который начинается на границе строки.
Процесс продолжается с (теперь завершенной) последней строки и остальных строки добавляются в очередь.