퀴즈: 큰 로그에서 구간만 꺼내기
시간순으로 쌓인 로그 파일에서 특정 시각의 시작 바이트를 이진 탐색으로 찾을 수 있다. 그 근거는?
- 시각 표기가 통일되어 있으면 문자열 비교의 결과가 시간 비교의 결과와 같기 때문이다
- 로그 줄의 길이가 모두 같아 n번째 줄의 위치를 곱셈 한 번으로 구할 수 있기 때문이다
- 파일 시스템이 줄 번호별 색인을 따로 유지해 seek 한 번으로 닿을 수 있기 때문이다
- grep 이 내부적으로 파일을 블록 단위로 건너뛰며 읽도록 최적화되어 있기 때문이다
구간의 시작 시각과 똑같은 시각의 줄이 세 개였다. 이진 탐색이 반드시 찾아야 하는 것은?
- 그 시각의 줄 가운데 아무거나 하나. 시각이 같으니 어느 것을 잡아도 결과는 같다
- 그 시각의 마지막 줄. 경계가 반열림이라 같은 시각의 앞 두 줄은 구간 밖이다
- 그 시각의 첫 줄. 하나라도 앞에 남으면 구간에 들어갈 줄이 조용히 빠진다
- 그 시각의 바로 앞 줄. 경계를 한 줄 넉넉히 잡아야 빠지는 줄이 없다
app.log, app.log.1, app.log.2.gz 가 있다. 기본 설정의 logrotate 에서 시간 순서는?
- app.log.1 이 가장 오래되었고 번호가 커질수록 새 파일이며 app.log 가 마지막이다
- 숫자가 클수록 과거이고 확장자가 없는 app.log 가 지금 쓰는 가장 새 파일이다
- 확장자가 없는 app.log 가 가장 오래되었고 압축된 것일수록 최근 파일이다
- 파일의 수정 시각이 유일한 단서라서 이름만으로는 순서를 판단할 수 없다
구간이 app.log.2.gz 안에 있다. 이 파일에서 구간을 꺼내는 올바른 방법은?
- gzip 파일은 블록마다 색인이 있어 비압축 파일과 똑같이 이진 탐색이 동작한다
- 먼저 통째로 풀어 임시 파일로 만든 뒤 그 파일에 이진 탐색을 거는 것이 가장 싸다
- 압축본은 뒤에서부터도 풀 수 있어 구간이 끝 쪽이면 오히려 더 적게 읽는다
- 앞에서부터 한 번만 훑되 구간의 끝을 지나면 그 자리에서 멈추는 것이 답이다
구간을 반열림 [시작, 끝) 이 아니라 양쪽 모두 포함으로 잡았다. 무엇이 어긋나는가?
- 끝 시각의 줄이 빠져 사고의 마지막 순간이 결과에서 사라진다
- 시작 시각의 줄이 두 번 세어져 구간의 합계가 실제보다 부풀려진다
- 이어지는 구간을 나란히 뽑을 때 경계 시각의 줄이 두 구간에 모두 들어간다
- 파일의 마지막 줄을 읽지 못해 결과가 늘 한 줄씩 모자라게 나온다
이진 탐색으로 꺼낸 구간이 맞는지 증명하려 한다. 가장 확실한 방법은?
- 같은 구간을 통째로 훑는 느린 방법으로도 뽑아 줄 수와 해시를 대조한다
- 뽑아 낸 파일의 첫 줄과 마지막 줄의 시각이 구간 안에 들어 있는지 확인한다
- 빠른 방법을 두 번 돌려 두 번의 결과가 같은 해시를 내는지 확인한다
- 뽑힌 줄 수가 초당 유입량과 구간 길이를 곱한 값과 맞아떨어지는지 확인한다