python seek () с начала или с текущей позиции? - PullRequest
0 голосов
/ 17 мая 2018

Я имею дело с большим файлом (> 500 ГБ, несколько столбцов, но несколько строк), и мне нужно получить оттуда несколько строк.У меня есть этот список начальных и конечных байтов (измеряется от начала файла) для частей, которые мне нужны, что-то вроде:

A,0,500
B,1089,4899

Вот что: я должен сделать это около 1,2 М раз,Что лучше для производительности: всегда начинать с начала документа или считать с текущей позиции?Так что это будет что-то вроде:

with open(large_file, 'r') as f:
    for start_byte, end_byte in byte_list:
        f.seek(start_byte) # always start from beginning of file
        chunk_str = f.read(end_byte-start_byte)

или

with open(large_file, 'r') as f:
    current_pos = 0
    for start_byte, end_byte in byte_list:
        f.seek(start_byte - current_pos, 1) # seek from current position
        chunk_str = f.read(end_byte-start_byte)
        current_pos = end_byte

Или это вообще имеет значение?Я прочитал Как работает функция поиска в Python? , но у меня недостаточно технических навыков, чтобы понять, как это повлияет на чтение очень больших текстовых файлов.

1 Ответ

0 голосов
/ 17 мая 2018

Просто используйте абсолютную форму, поскольку абсолютное смещение в байтах - это то, что у вас есть.Фактически чтение из правильного местоположения после использования seek похоронено в драйвере файловой системы, используемом вашей ОС.seek сам по себе делает чуть больше, чем устанавливает переменную.

Вы бы использовали f.seek(d, 1), если вы еще не знаете свою текущую позицию, но знаете, что вам нужно пропустить вперед на d байт.

...