クイズ: 全部は載らないファイル
한국어 원문으로 표시합니다.
파드에서 돌던 집계 스크립트가 어느 날부터 아무 로그도 없이 사라진다. 가장 먼저 의심할 것은?
- 파일을 통째로 읽어 리스트에 담는 부분이 메모리 한도를 넘겨 커널에 죽었다
- 표준출력 버퍼가 가득 차서 프로세스가 멈춘 것이다
- 파일이 다른 프로세스에 잠겨 있어 열리지 않은 것이다
- 파이썬이 예외를 삼켜 표준오류로 내보내지 못한 것이다
1억 줄 파일에서 금액 상위 100건을 뽑아야 한다. 메모리를 가장 적게 쓰는 방식은?
- 파일을 정렬한 뒤 앞에서 100줄을 자른다
- 크기 100의 최소 힙을 두고 새 값이 맨 밑보다 클 때만 밀어 넣는다
- 금액 기준으로 사전을 만들어 값별 건수를 세고 위에서부터 100건을 고른다
- 전체를 읽어 리스트에 담은 뒤 부분 정렬로 앞 100개만 정렬한다
한 줄씩 읽는 코드로 고유 세션 아이디 개수를 센다. 메모리는 무엇에 비례하는가?
- 파일의 바이트 크기에 비례한다
- 읽은 줄 수에 비례한다
- 값의 가짓수에 비례한다
- 한 줄의 최대 길이에 비례해 일정하게 유지된다
스트리밍으로 짰다는 것을 가장 잘 증명하는 방법은?
- 큰 파일로 한 번 돌려 보고 끝난 시간을 기록한다
- 코드에 read() 와 readlines() 가 없다는 것을 검토로 확인한다
- 실행 중에 top 으로 메모리 사용량을 지켜본다
- 주소 공간 상한을 걸고 돌려 통과와 실패를 종료 코드로 남긴다
외부 정렬의 병합 단계에서 메모리에 올라가는 것은 무엇인가?
- 청크 파일마다 한 줄씩, 그리고 그 줄들을 견주는 작은 힙
- 가장 큰 청크 파일 하나 전체
- 모든 청크 파일의 내용 전체. 그래서 병합은 메모리를 가장 많이 쓴다
- 정렬 키의 모든 고유값 목록
정렬 결과가 원본의 줄을 하나도 잃거나 겹치지 않았음을 스트리밍으로 확인하려면?
- 원본과 결과를 각각 리스트로 읽어 정렬한 뒤 통째로 비교한다
- 줄마다 해시를 내어 전부 더한 값과 건수를 양쪽에서 각각 구해 견준다
- 두 파일의 바이트 단위 체크섬을 구해 같은지 본다
- 결과 파일의 첫 줄과 마지막 줄이 원본의 최솟값과 최댓값인지 본다