Когда запускается запись на диск? - PullRequest
0 голосов
/ 28 мая 2018

В Python я могу открыть файл с f= open(<filename>,<permissions>).Это возвращает объект f, в который я могу записать, используя f.write(<some data>).

. Если в этот момент я получаю доступ к исходному финалу (например, с cat из терминала), он выглядит пустым: Pythonсохранил данные, которые я записал в объект f, а не в самом файле на диске.Если я затем вызываю f.close(), данные в f сохраняются в файле на диске (и я могу получить к нему доступ из других программ).

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

1 Ответ

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

Общая тема буферизации ввода / вывода неоднократно рассматривалась (в том числе в вопросах, связанных с комментариями).Но чтобы ответить на ваши конкретные вопросы:

  • По умолчанию при записи в терминал («экран») новая строка заставляет текст проходить через него.Для всех файлов буфер очищается при каждом заполнении.(Большие одиночные записи могут сбрасывать любое существующее содержимое буфера и затем обходить его.)
  • Буфер имеет фиксированный размер и выделяется перед записью любых данных;Python 3 не использует stdio, поэтому он выбирает собственные размеры буфера.(Типично несколько кБ.)
  • «Дисковый ввод-вывод» (действительно, ввод-вывод ядра, который различим только при определенных особых обстоятельствах, таких как сбой сети / питания), происходит в пределах любая запись Python вызывает сброс.
  • Да, он может зависнуть, если файл представляет собой канал для занятого процесса, сокет в медленной сети, специальное устройство или даже обычный файл, смонтированный с удаленного компьютера.машина.
...