Есть ли способ найти размер буфера файлового объекта
Я пытаюсь "отобразить" очень большой файл ASCII. По сути, я читаю строки, пока не найду определенный тег, а затем хочу узнать положение этого тега, чтобы позже я мог искать его снова, чтобы извлечь связанные данные.
from itertools import dropwhile
with open(datafile) as fin:
ifin = dropwhile(lambda x:not x.startswith('Foo'), fin)
header = next(ifin)
position = fin.tell()
Теперь это tell
не дает мне правильную позицию. Этот вопрос задавался в различных формах ранее. Вероятно, причина в том, что python буферизует объект файла. Итак, python сообщает мне, где находится указатель файла, а не мой указатель файла. Я не хочу отключать эту буферизацию... Производительность здесь важна. Однако было бы неплохо узнать, есть ли способ определить, сколько байтов Python выбирает для буферизации. В моем реальном приложении, пока я закрываю строки, начинающиеся с Foo
это не имеет значения. Я могу оставить несколько строк здесь и там. Итак, что я на самом деле планирую сделать, это что-то вроде:
position = fin.tell() - buffer_size(fin)
Есть ли способ найти размер буфера?
1 ответ
Мне кажется, что размер буфера в Cpython жестко задан как 8192. Насколько я могу судить, нет никакого способа получить это число из интерфейса Python, кроме как читать одну строку при открытии файла. сделать f.tell()
чтобы выяснить, сколько данных Python на самом деле читает, а затем выполнить поиск в начале файла, прежде чем продолжить.
with open(datafile) as fin:
next(fin)
bufsize = fin.tell()
fin.seek(0)
ifin = dropwhile(lambda x:not x.startswith('Foo'), fin)
header = next(ifin)
position = fin.tell()
Конечно, это терпит неудачу в том случае, если длина первой строки превышает 8192 байта, но это не имеет никакого реального значения для моего приложения.