У меня был интересный опыт с буферизацией файлов в Python, и я хотел знать, что я правильно понимаю. Учитывая
[оболочка Python 2.7]
...
model = (really big Numpy model)
f = open('file.out','w')
pickle.dump(model, f)
(pickle.dump() finishes while I'm doing other things)
[Bash shell]
$ ls -l
-rw-r--r-- 1 john staff 270655488 Dec 6 21:32 file.out
[Вернуться в оболочку Python]
model = (different really big Numpy model)
f = open('newfile.out','w')
pickle.dump(model,f)
(pickle.dump() finishes)
[Bash shell]
$ ls -l
-rw-r--r-- 1 john staff 270659455 Dec 7 07:09 file.out
-rw-r--r-- 1 john staff 270659451 Dec 6 20:48 newfile.out
Примечание file.out теперь другого размера.
Теперь я знаю, что файловый буфер Python по умолчанию соответствует размеру системы (я на Mac OSX), поэтому, похоже, что в буфере файлов все еще оставалось 3967 байт, пока я облажался, и буфер файлов Mac OSX больше этого.
Что меня заинтересовало, так это то, что я принудительно переназначал файловый объект 'f' другому открытому файлу без фактического вызова f.close () (Честно говоря, я просто работал очень быстро, чтобы протестировать что-то еще и забыл). Когда я посмотрел на размер файла, я наполовину ожидал, что он останется прежним (что может означать усечение вывода)
Итак, вопрос в том, безопасна ли эта процедура. Оборачивается ли присвоение файлового объекта таким образом, что либо сборщик мусора Python, либо сам файловый объект очищает буфер и закрывает файл при таком внезапном переназначении переменной, даже если вы не вызываете метод close () ? Что еще более важно, это всегда случай или возможно, что переопределение переменной действительно сделал - или в другой ситуации может - усечь это буфер до очистки буфера файлов.
Я полагаю, что это действительно вопрос того, насколько элегантны и безопасны файловые объекты и сборщик мусора Python, когда они ищут объекты без соответствующего уничтожения.