@burov0798
Пытаюсь изучать php\js

Как быстро обработать большой файл в python?

Добрый день. Имеется файл на 40 миллионов строк (5гб веса), нужно каждую строку прочитать, отформатировать ее и записать в другой файл.

Если пробовать просто читать построчно, то выходит очень долго:

with io.open('part1.txt', encoding='utf_8_sig') as file:
    for line in file:
        process(line)


Пробовал таким методом:

import multiprocessing as mp


def process(line):
   #Тут обрабатываю строку и сохраняю в файл ее

def process_wrapper(lineByte):
   with open("part1.txt") as f:
       f.seek(lineByte)
       line = f.readline()
       process(line)

pool = mp.Pool(2)
jobs = []

with open("part1.txt") as f:
   nextLineByte = f.tell()
   for line in f:
       jobs.append( pool.apply_async(process_wrapper,(nextLineByte)) )
       nextLineByte = f.tell()

for job in jobs:
   job.get()

pool.close()

Но получаю ошибку:
Traceback (most recent call last):
  File "/home/test.py", line 20, in <module>
    nextLineByte = f.tell()
OSError: telling position disabled by next() call

В каком направлении лучше копать? Обработа ведется на сервере с 8 ядрами и 8гб оперативной памяти
  • Вопрос задан
  • 1888 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Распараллеливать чтение файла бесполезно, только создадите борьбу за единственный ресурс, что приведёт к снижению скорости. Можно попробовать открыть файл в бинарном режиме и читать большими блоками, но это вряд ли существенно увеличит скорость, зато добавит проблем с обработкой случаев, когда в блок попала только часть строки.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Yanis07
Возможно поможет использование отдельных тредов для чтения, процессинга строки и записи ускорит работу, но вообще не факт.

У Петона беда много поточностью. Смотрите - python global interpreter lock.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы