2013-10-14 1 views
0

필요에 따라 바이트를 읽지 않고 한 파일에서 전체 파일을 읽는 데 장단점이 있습니까?전체 파일을 읽는 데 어떤 이점이 있습니까?

file_handle = open("somefile", rb) 
part1 = file_handle.read(10) 
# do some stuff 
part2 = file_handle.read(8) 
# do some more stuff etc 

배경 :

file_handle = open("somefile", rb) 
file_contents = file_handle.read() 
# do all the things using file_contents 

에 비해 : 그래서 어떤 장점이있다 파이썬에서 P 코드 (바이트 코드) 인터프리터를 쓰고 있어요 그리고 처음에 단지 바이트를 읽어내는 순진 구현을 작성했습니다 필요에 따라 파일에서 필요한 작업을 수행합니다. 프로그램을 보여주고 있던 친구가 전체 파일을 메모리 (파이썬 목록)로 읽은 다음 느린 디스크 읽기를 피하기 위해 메모리에서 처리해야한다고 제안했습니다. 테스트 파일은 현재 1KB 미만이고 아마도 최대 100KB이므로 운영 체제 및 디스크 컨트롤러 시스템이 파일을 캐시하여 파일의 작은 덩어리를 반복적으로 읽음으로써 발생하는 성능 문제를 해결할 것으로 기대했을 것입니다.

+1

귀하의 친구가 맞으며, 실행 환경에 대한 귀하의 믿음이 잘못 배치 된 것 같습니다. 가능한 한 최선을 다해 당신을 세부적인 것으로부터 격리 시키려고 노력할 것이지만 그렇게 많이 도움이되지는 않을 것입니다. –

답변

2

임의의 종류의 임의 액세스를 원하면 목록에 넣는 것이 디스크에서 찾는 것보다 훨씬 빠릅니다. OS가 캐시 디스크 액세스를 수행하더라도 다른 캐시 계층에 도달하게됩니다. 어쨌든 OS가 어떻게 동작하는지 확신 할 수 없습니다.

  • 당신은 당신이 당신의 프로그램 카운터에 번호를 추가하여 실행할 수있는 점프 명령이있을 수 있습니다 :

    는 여기에 내가 메모리 내 그것을하고 동기를 부여 것이라고 생각할 수 삼가지 경우입니다. 배열의 인덱스 대 파일을 찾는 것이 좋은 유스 케이스이다.

  • VM의 동작을 최적화하려는 경우 파일을 두 번 이상 읽는 것이 좋습니다. 목록을 두 번 스캔하는 것과 파일을 두 번 읽는 것이 훨씬 빠릅니다.

  • 언어의 opcode 및 문법에 따라 실행 속도를 높이려면 '주기'를 미리 볼 수 있습니다. 결국 두 번의 탐색이 끝나면 성능이 저하 될 수 있습니다.

파일이 항상 RAM에 충분히 작을 경우 메모리에 모든 파일을 읽을 가치가 있습니다. 실제 프로그램으로 프로파일 링하고 눈에 띄게 빨라지는지 확인하십시오.

3

캐시를 제쳐두고 캐시하려면 시스템 콜이입니다. 각 read()은 커널을 트리거하는 모드 전환을 발생시킵니다. strace 또는 시스템 호출을 볼 수있는 다른 도구를 통해 알 수 있습니다.

그러나 100KB 파일의 경우시기 상조 일 수 있습니다. 항상 그렇듯이 코드을 확실히 테스트하십시오.

1

성능을 찾고있는 경우 generators을 권장합니다. 파일 크기가 작기 때문에 메모리는 큰 문제는 아니지만 여전히 좋은 습관입니다. 디스크에서 파일을 여러 번 읽는 것은 확장 가능한 솔루션의 분명한 병목입니다.

2

read()에 대한 단일 호출은 read()에 대한 다중 호출보다 빠릅니다. 하나의 호출로 모든 데이터를 한 번에 메모리에 저장할 수 있어야하는 반면, 여러 번의 읽기에서는 총 데이터 양 중 일부만 유지하면된다는 장점이 있습니다. 단지 몇 킬로바이트 또는 메가 바이트 인 파일의 경우 차이가 눈에 띄지 않습니다.크기가 여러 개인 파일의 경우 메모리가 더 중요해진다.

또한 단일 읽기를 수행하려면 모든 데이터가 있어야하지만 외부 소스에서 스트리밍되는 동안 여러 읽기를 사용하여 데이터를 처리 할 수 ​​있습니다.

+0

파일을 버퍼링 된 스트림으로 여는 것이 다중 읽기의 영향을 줄입니까? – Caltor

관련 문제