Python: самый быстрый способ обработки большого файла

У меня есть несколько файлов с разделителями табуляции 3 ГБ. В каждом файле содержится 20 миллионов строк. Все строки должны обрабатываться независимо друг от друга, без каких-либо связей между двумя строками. Мой вопрос в том, что будет быстрее A. Чтение строки за строкой с использованием `

with open() as infile: for line in infile: 

Или B. Чтение файла в память в кусках и его обработка, скажем, 250 МБ за раз?

Обработка не очень сложная, я просто хватаю значение в столбце1 в List1, column2 в List2 и т. Д. Возможно, нужно добавить некоторые значения столбцов вместе.

Я использую python 2.7 в ящике linux, который имеет 30 ГБ памяти. Текст ASCII.

Любой способ ускорить работу параллельно? Сейчас я использую прежний метод, и процесс выполняется очень медленно. Используется ли какой-либо модуль CSVReader? Мне не нужно это делать в python, приветствуются любые другие идеи использования языка или базы данных. Благодарю.

`

  • Python и разрывы строк
  • Почему преобразование списка в набор быстрее, чем просто список для вычисления разницы в списках?
  • Python - как обрабатывать HTTPS-запрос с помощью (Urllib2 + SSL), хотя HTTP-прокси
  • объединить настраиваемый формат разреженной матрицы X с целевым массивом Y в Python
  • Почему некоторые методы списка в Python работают только с определенными переменными?
  • Эффективное чтение XML-файла объемом 800 ГБ в Python 2.7
  • Почему рекурсия в python настолько медленная?
  • Как расширить список целых чисел на основе порога?
  • One Solution collect form web for “Python: самый быстрый способ обработки большого файла”

    Похоже, что ваш код связан с I / O. Это означает, что многопроцессорность не поможет – если вы тратите 90% времени на чтение с диска, наличие дополнительных 7 процессов, ожидающих следующего чтения, ничего не поможет.

    И, используя модуль чтения CSV (будь то csv stdlib или что-то вроде NumPy или Pandas), может быть хорошей идеей для простоты, вряд ли это сильно повлияет на производительность.

    Тем не менее, стоит проверить, что вы действительно связаны с I / O, а не просто гадать. Запустите свою программу и посмотрите, приближается ли ваш процессор к 0% или близко к 100% или к ядру. Сделайте то, что предложил Амадан в комментарии, и запустите свою программу с помощью простого pass для обработки и посмотрите, отключается ли это в 5% случаев или 70%. Вы даже можете попробовать сравнить с циклом os.open и os.read(1024*1024) или что-то еще, и посмотреть, будет ли это быстрее.


    Поскольку вы используете Python 2.x, Python полагается на библиотеку C stdio, чтобы угадать, сколько буферов за раз, поэтому может стоить заставлять его буферизировать больше. Самый простой способ сделать это – использовать readlines(bufsize) для некоторого большого bufsize . (Вы можете попробовать разные цифры и измерить их, чтобы увидеть, где находится пик. По моему опыту, обычно что-либо из 64K-8MB примерно одинаково, но в зависимости от вашей системы, которая может быть другой, особенно если вы, например, читаете от сетевой файловой системы с большой пропускной способностью, но с ужасной задержкой, которая увеличивает пропускную способность и время ожидания реального физического диска и кэширование ОС).

    Так, например:

     bufsize = 65536 with open(path) as infile: while True: lines = infile.readlines(bufsize) if not lines: break for line in lines: process(line) 

    Между тем, предположив, что вы находитесь в 64-битной системе, вы можете попробовать использовать mmap вместо того, чтобы читать файл в первую очередь. Это, конечно же, не гарантирует, что будет лучше, но может быть лучше, в зависимости от вашей системы. Например:

     with open(path) as infile: m = mmap.mmap(infile, 0, access=mmap.ACCESS_READ) 

    Python mmap является своего рода странным объектом – он действует как str и подобно file в одно и то же время, поэтому вы можете, например, вручную перебирать сканирование для строк новой строки или вызывать на нем readline как если бы это был файл. Обе из них потребуют большей обработки от Python, чем повторение файла в виде строк или выполнение строк для readlines (поскольку цикл, который будет в C, теперь находится в чистом Python … хотя, возможно, вы можете обойти это с помощью re или с простым расширением Cython ?) … но преимущество I / O от ОС, зная, что вы делаете с отображением, может подорвать недостаток ЦП.

    К сожалению, Python не раскрывает madvise вызов, который вы бы использовали, чтобы изменить настройки, пытаясь оптимизировать это в C (например, явно устанавливая MADV_SEQUENTIAL вместо того, чтобы угадывать ядро ​​или заставлять прозрачные огромные страницы), – но вы можете на самом деле ctypes функция из libc .

    Python - лучший язык программирования в мире.