2010-12-07 2 views
0

파이썬의 파일 버퍼링에 대한 흥미로운 경험이 있었고 올바르게 이해하고 있다는 것을 알고 싶었습니다. 을 감안할 때변수 버퍼를 사용하여 파이썬에서 플러시하고 닫는 파일 버퍼

[파이썬 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) 

[배쉬 쉘]

$ ls -l 
-rw-r--r-- 1 john staff 270655488 Dec 6 21:32 file.out 

[반품 파이썬 쉘]

model = (different really big Numpy model) 
f = open('newfile.out','w') 
pickle.dump(model,f) 
(pickle.dump() finishes) 

[배쉬 쉘]

$ 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은 이제 다른 크기입니다.

이제 파이썬의 파일 버퍼가 시스템 크기 (기본적으로 Mac OSX)로 설정되어 있다는 것을 알고 있습니다. 따라서 파일 버퍼에 파일 버퍼가 3,667 바이트로 남아있는 것 같습니다. Mac OSX 파일 버퍼가 그보다 큽니다.

나는 f.close()를 호출하지 않고 파일 객체 'f'를 다른 열린 파일에 강제로 재 할당했다는 사실에 관심이 많았다. (솔직히 다른 것을 시험해보고 깜빡했다.) 파일 크기를 보았을 때, 나는 똑같이 유지 될 것이라고 기대했다. (결과물을 자르는 것을 의미 할 수도있다.)

그래서 이것은 안전한 절차인지의 여부이다. 파일 객체 할당이 파이썬 가비지 컬렉터 또는 파일 객체 자체가 버퍼를 비우고 close() 메소드를 호출하지 않아도 갑작스러운 변수 재 할당을 통해 파일을 닫는 방식으로 래핑됩니까? ? 더욱 중요한 것은 이 항상이거나, 실제로 변수 할당이 이 아니면 이 될 수도 있습니다. - 파일 버퍼가 플러시되기 전에 해당 버퍼가 잘릴 수 있습니다.

파일 개체와 파이썬 가비지 컬렉터가 적절하게 파괴되지 않은 채로 객체를 잡아 당기는 것이 얼마나 우아하고 안전한 지 궁금합니다.

답변

2

컴퓨터가 충돌하지 않는 한 파일을 닫지 않아도 데이터가 손실되지 않습니다. 파이썬은 해당 파일 객체가 가비지 수집되는 경우 실제로 파일을 닫습니다. 당신이 설명한 경우, 파일에 대한 유일한 참조는 f 이었으므로 다른 이름으로 이름을 사용할 때 닫혔습니다.

어쨌든 파일을 닫아 파일 개체가 할당 한 시스템 자원을 해제하는 것이 좋습니다. 어떤 상황에서는 파일 객체가 언제 가비지 수집 될지 정확히 알지 못합니다. 예를 들어 오류가 발생하는 경우 파일 객체에 대한 참조가 추적 객체에 저장되어 가비지 수집을 방지 할 수 있습니다. 인터프리터가 종료되면 모든 파일이 닫힙니다.

+0

감사합니다, 스벤, 내가 생각한 것입니다. 방금 확인을 원했어. 파이썬의 가비지 컬렉터를 좋아하셔야합니다. 시간이 지나치게 부피가 크지 만 너무 빨리 타이핑하는 바보 같은 사람을 잡으면 달콤한 맛! – JohnMetta

0

pickle 덤프는 기본적으로 ASCII 형식 (프로토콜 0)을 사용하므로 길이는 실제 데이터에 따라 다릅니다. 바이너리 덤프를 사용하려면 -1을 버전으로 전달할 수 있습니다 (단, "wb"및 "rb"를 사용해야 함).

+0

2.7에서 2 인 pickle.HIGHEST_PROTOCOL을 사용했습니다. 언급 했어야합니다. – JohnMetta