정확히 파이썬의 file.flush ()가 무엇을하고 있습니까?
File Objects 에 대한 Python 설명서 에서 이것을 발견했습니다 .
flush ()는 반드시 파일의 데이터를 디스크에 쓸 필요는 없습니다. flush () 다음에 os.fsync ()를 사용하여이 동작을 확인하십시오.
그래서 내 질문은 : 파이썬이 정확히 무엇을 flush
하고 있습니까? 디스크에 데이터를 쓰도록 강요했지만 지금은 그렇지 않습니다. 왜?
일반적으로 두 가지 레벨의 버퍼링이 관련됩니다.
- 내부 버퍼
- 운영 체제 버퍼
내부 버퍼는 프로그래밍중인 런타임 / 라이브러리 / 언어에 의해 생성 된 버퍼이며 모든 쓰기에 대한 시스템 호출을 피함으로써 작업 속도를 향상시킵니다. 대신 파일 객체에 쓸 때 해당 버퍼에 쓰고 버퍼가 채워질 때마다 시스템 호출을 사용하여 실제 파일에 데이터가 기록됩니다.
그러나 운영 체제 버퍼로 인해 데이터가 디스크에 기록 되는 것은 아닙니다 . 데이터가 런타임에 의해 유지 관리되는 버퍼에서 운영 체제가 유지 관리하는 버퍼로 복사된다는 의미 일 수도 있습니다.
무언가를 쓰면 버퍼에서 끝나고 (시스템 만) 전원이 꺼지면 시스템이 꺼질 때 해당 데이터가 디스크에 있지 않습니다.
따라서이를 돕기 위해 각각의 객체에 flush
및 fsync
메소드가 있습니다.
첫 번째 flush
는 프로그램 버퍼에 남아있는 데이터를 실제 파일에 기록합니다. 일반적으로 이는 데이터가 프로그램 버퍼에서 운영 체제 버퍼로 복사됨을 의미합니다.
특히 이것은 다른 프로세스가 동일한 파일을 읽기 위해 열려있는 경우 방금 파일로 플러시 한 데이터에 액세스 할 수 있다는 것입니다. 그러나 반드시 "영구적으로"디스크에 저장되었다는 의미는 아닙니다.
그러기 위해서는 os.fsync
모든 운영 체제 버퍼가 저장 장치와 동기화되도록 하는 메소드 를 호출해야합니다. 즉,이 메소드는 운영 체제 버퍼에서 디스크로 데이터를 복사합니다.
일반적으로 두 방법 중 하나를 신경 쓸 필요는 없지만 실제로 디스크에서 끝나는 것에 대한 편집증이 좋은 시나리오 인 경우 지시에 따라 두 호출을 모두 수행해야합니다.
2018 년 부록.
캐시 메커니즘이있는 디스크는 이제 2013 년보다 훨씬 일반적이므로 이제 더 많은 수준의 캐싱 및 버퍼가 필요합니다. 나는 가정 이 버퍼뿐만 아니라 동기화 / 플러시 호출에 의해 처리됩니다,하지만 난 정말 모르겠어요.
운영 체제가 그렇지 않을 수 있기 때문입니다. 플러시 작업은 파일 데이터를 RAM의 파일 캐시에 저장하며, 실제로 디스크에서 파일을 전송하는 것은 OS의 작업입니다.
내부 버퍼를 플러시하여 OS가 버퍼를 파일에 씁니다. [1] Python은 달리 구성하지 않는 한 OS의 기본 버퍼링을 사용합니다.
그러나 때때로 OS는 여전히 협력하지 않기로 선택합니다. 특히 Windows / NTFS의 쓰기 지연과 같은 멋진 기능이 있습니다. 기본적으로 내부 버퍼는 플러시되지만 OS 버퍼는 계속 유지합니다. 따라서 OS에 디스크에 쓰도록 지시해야합니다 os.fsync()
.
[1] http://docs.python.org/library/stdtypes.html
flush ()는 기본적으로 RAM 버퍼를 정리합니다. 실제로 나중에 나중에 계속 쓸 수는 있지만 파일에 대한 가장 안전하고 안전한 쓰기 기능으로 생각해서는 안됩니다. 더 많은 데이터를 얻기 위해 RAM을 비우는 것입니다. 데이터가 파일에 안전하게 기록되도록하려면 close ()를 대신 사용하십시오.
참고 URL : https://stackoverflow.com/questions/7127075/what-exactly-the-pythons-file-flush-is-doing
'programing tip' 카테고리의 다른 글
선택적 매개 변수를 함수에 전달하는 방법이 있습니까? (0) | 2020.07.10 |
---|---|
안드로이드 아카이브 라이브러리 (ar) vs 표준 jar (0) | 2020.07.10 |
리눅스에서 gcc를위한 간단한 makefile을 어떻게 만드나요? (0) | 2020.07.10 |
iPython 출력에 HTML을 포함시키는 방법은 무엇입니까? (0) | 2020.07.10 |
제출하기 전에 어떻게해야합니까? (0) | 2020.07.10 |