파일을 여는 데 특별히 with open
문을 사용해야합니다. 몇 백 개의 파일을 함께 열고 K- 방향 병합을 사용하여 병합해야하기 때문입니다. 나는 K가 낮게 유지되어야한다는 것이 이상적이지만, 나는이 문제를 예견하지 못했다."open with"문을 사용하여 여러 파일 (미리 알려지지 않은 파일 수)을 어떻게 열 수 있습니까?
마감 기한이 만료되어 처음부터 시작하는 옵션이 없습니다. 그래서이 시점에서 필자는 파일의 전체/거대한 부분을 메모리에 저장하지 않는 매우 빠른 I/O가 필요합니다. 왜냐하면 수백 개의 파일이 있기 때문에 각각 ~ 10MB입니다. K 웨이 병합을 위해 한 번에 한 줄씩 읽어야합니다. 현재 메모리 사용량을 줄이는 것이 내 주된 목표입니다.
나는 with open
이 가장 효율적인 기술이라는 것을 알았지 만 open
모든 파일을 단일 with open
문에 함께 표시하는 방법을 이해할 수 없습니다. 실례합니다. 초심자의 무지!
업데이트 :이 문제가 해결되었습니다. 문제는 파일을 어떻게 열어 놓는 것이 아니라는 것이 밝혀졌습니다. 과도한 메모리 사용은 비효율적 인 가비지 수집으로 인한 것임을 알게되었습니다. 나는 with open
을 전혀 사용하지 않았다. 나는 보통 f=open()
과 f.close()
을 사용했다. 가비지 콜렉션이 저장되었습니다.
''열린 상태 '는'f = open() ... close (f)'보다 더 효율적이라고 생각하지 않습니다. 그것은 더 편리하다고 생각되지만, 그것은 당신의 상황에서 그렇지 않은 것처럼 들립니다. 파일 묶음을 열어 파일 개체를 목록에 보관할 수 있습니다. –
'with' 문은 효율성과 아무런 관련이 없습니다. 예외가 발생하더라도 암시 적으로 파일이 닫힐 것입니다. @MarkkuK에 따르면 파일 객체에 대한 참조를 목록에 저장 한 다음 끝에 수동으로 닫고 try-finally 블록을 사용하여 오류가 발생하더라도 파일이 닫혀 있는지 확인할 수 있습니다. –
빠른 응답을 보내 주셔서 감사합니다. 몇 백개의 파일을 열어도 메모리 사용량이 그렇게 높지 않을 수있는 대체 방법을 제안 할 수 있습니까? 이 파일들에서 한 번에 한 줄씩 만 필요하기 때문에 버퍼에있는 파일의 상당 부분을로드하지 않는 기술을 사용하면 도움이 될 것이라고 생각합니다. –