Самый быстрый способ Python прочитать большой текстовый файл (несколько ГБ)

у меня есть большой текстовый файл (~ 7 ГБ). Я ищу, существует ли самый быстрый способ прочитать большой текстовый файл. Я читал об использовании нескольких подходов, таких как чтение по частям, чтобы ускорить процесс.

например, effbot предлагает

# File: readline-example-3.py

file = open("sample.txt")

while 1:
    lines = file.readlines(100000)
    if not lines:
        break
    for line in lines:
        pass # do something**strong text**

для обработки 96 900 строк текста в секунду. Другие авторы предлагают использовать islice ()

from itertools import islice

with open(...) as f:
    while True:
        next_n_lines = list(islice(f, n))
        if not next_n_lines:
            break
        # process next_n_lines

list(islice(f, n)) вернет список следующих n строк файла f. Использование этого внутри цикла даст вам файл кусками по n строк.


person Gianni Spear    schedule 18.02.2013    source источник
comment
Почему бы вам не проверить себя, что для вас быстрее?   -  person piokuc    schedule 18.02.2013
comment
Ознакомьтесь с предложениями здесь: stackoverflow.com/questions/14863224/   -  person BenDundee    schedule 18.02.2013
comment
@Nix, я хочу читать не построчно, а по частям   -  person Gianni Spear    schedule 19.02.2013
comment
Если вы просмотрите ответы, кто-то покажет, как это сделать кусками.   -  person Nix    schedule 19.02.2013
comment
дорогой @nix, я прочитал в effbot.org/zone/readline-performance.htm о Автор предлагает ускорить чтение строк, если вы обрабатываете действительно большие файлы, было бы неплохо, если бы вы могли ограничить размер фрагмента чем-то разумным. Страница довольно старая 09 июня 2000 года, и я ищу, есть ли более новый (и быстрый) подход.   -  person Gianni Spear    schedule 19.02.2013


Ответы (1)


with open(<FILE>) as FileObj:
    for lines in FileObj:
        print lines # or do some other thing with the line...

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

person Morten Larsen    schedule 18.02.2013
comment
Мортен построчно стал слишком медленным. - person Gianni Spear; 19.02.2013
comment
ааа, быстро прочитал... - person Morten Larsen; 19.02.2013
comment
Похоже, что результатом цикла FileObj является один символ, а не строка. - person Xb74Dkjb; 02.06.2017
comment
Большой файл размером 7 Гб может содержать только одну строку, и в этом случае ваше решение будет таким же неэффективным, как простое чтение всего файла FileObj.read(). Было бы лучше попробовать здесь несколько чанков МБ (например, кусками по 5 МБ), что можно выполнить, используя FileObj.read(5 * 1024 * 1024) несколько раз. - person Demian Wolf; 21.06.2020
comment
@DemianWolf Спасибо за комментарий, у меня есть вопрос. Что произойдет, если заданный размер ввода усекает половину слова. Например, если последнее слово — «Ответственность», и вы достигли предела фрагмента в «Ответе» полного слова «Ответственность», как бы вы с этим справились. Есть ли способ не нарушать слова или нам нужно следовать какому-то другому подходу? Спасибо! - person Sunny; 17.07.2020
comment
@Sunny, если файл сравнительно небольшой, то можно просто получить все слова из всего содержимого файла (with open("my_file.txt") as fp: print(fp.read().split()). Хотя в вашем случае, мне кажется, вы пытаетесь прочитать большой файл (иначе зачем вам его разбивать в кусках?). В этом случае вы можете использовать тот же подход к фрагментированию, но с одним отличием. После того, как вы прочитали фрагмент, вы должны читать следующие символы один за другим, пока не получите пробел (или другой подобный символ, как \n , \r и т. д.), а затем добавить только что прочитанную часть файла в последний фрагмент. - person Demian Wolf; 17.07.2020
comment
@DemianWolf, я имел в виду аналогичный подход, но я надеялся, что, возможно, найдется лучший способ справиться с этим. Спасибо, в любом случае! - person Sunny; 18.07.2020