Очистка и закрытие файлового буфера в Python с переназначением переменной - PullRequest
0 голосов
/ 07 декабря 2010

У меня был интересный опыт с буферизацией файлов в 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, когда они ищут объекты без соответствующего уничтожения.

Ответы [ 2 ]

2 голосов
/ 07 декабря 2010

Пока ваш компьютер не падает, вы не потеряете данные, если не закроете файл. Python действительно закрывает файлы, если соответствующие файловые объекты собираются мусором. В описанном вами случае имя f было единственной ссылкой на файл, поэтому оно было закрыто, когда вы использовали имя для чего-то еще.

Обратите внимание, что в любом случае рекомендуется закрывать файлы, чтобы освободить системные ресурсы, выделенные файловым объектом. В некоторых ситуациях вы точно не знаете, когда файловый объект будет собирать мусор - например, в случае ошибки ссылка на файловый объект может быть сохранена в объекте трассировки, что предотвращает сбор мусора. Все файлы закрываются при выходе из переводчика.

0 голосов
/ 07 декабря 2010

маринованные дампы по умолчанию с использованием формата ASCII (протокол 0), поэтому длина зависит от фактических данных. Чтобы использовать двоичный дамп, вы можете передать -1 в качестве версии (однако учтите, что для этого потребуется использовать «wb» и «rb»).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...