Где хранятся Python файловые буферы? - PullRequest
3 голосов
/ 15 апреля 2020

Недавно реализовал API формата файлов, и ему было интересно, почему размер файла не обновлялся до close(). Произвел поиск и обнаружил, что содержимое записывается в буфер до тех пор, пока не будет вызван close(). Я хотел посмотреть, смогу ли я обновить размер файла при вызове записи, поэтому я добавил вызов flush(), но он ничего не сделал, если не был вызван os.fsync().

Для API скорость это все. Вызов flush() с os.fsync() выполняется медленнее, потому что теперь происходит запись на диск. Получается, что он почти в 2 раза медленнее, поэтому лучше использовать буфер и ждать close(). Тем не менее, некоторые из этих файлов могут стать довольно большими, и необходимо учитывать объем памяти. По этой причине я бы подумал, что очистка буфера на диск будет лучшей, пока я не заметил, что буфер ~ 4 ГБ даже не появляется в памяти. Я следил за процессом записи файла 4 ГБ, и использование памяти никогда не увеличивалось; на лице общая память никогда не увеличивалась. Мониторинг диска показывает записи, происходящие до того, как close() даже вызван, но операционная система не знает, что размер файла увеличился.

Итак, где существуют эти буферы для хранения этой информации перед записью на диск?

Редактировать:

Проведя дополнительное исследование, я обнаружил следующее:

  • io.DEFAULT_BUFFER_SIZE - это 8192 байта
  • Появляется CPython использует внутренние буферы

Я не знаком с файловым вводом-выводом на этом уровне, но я предполагаю, что когда внутренний буфер заполнен, это «передается» в буфер операционной системы, а затем записывается на диск. Однако, даже если он записан на диск, операционная система не обновляет свой вид файла (то есть его размер / свойства), пока поток не будет закрыт.

...