Есть ли способ найти размер буфера файлового объекта

Я пытаюсь "отобразить" очень большой файл 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 байта, но это не имеет никакого реального значения для моего приложения.

Другие вопросы по тегам