파일을 한 줄씩 읽는 C++ 응용 프로그램을 작성했습니다. 한 줄을 읽고 처리한 후 다음 줄을 읽습니다.
gzip 압축 파일에 대한 지원을 추가하고 C++ 압축 해제 라이브러리를 사용하는 대안을 찾고 있습니다. 한 가지 해결책은 전체 파일의 압축을 풀고 평소대로 읽는 것입니다.
zcat
하지만 저는 매우 큰 파일을 작업하고 있는데, 파일의 첫 번째 줄을 즉시 압축 해제하여 빠른 시작 시간을 갖는 것을 선호합니다. 문제는 선택하지 않은 채로 두면 zcat
내 응용 프로그램이 따라잡을 수 없을 만큼 파일의 압축이 너무 빨리 풀려 시스템 명령의 출력 버퍼가 내 응용 프로그램이 처음 몇 줄에서 계속 작업하는 동안 압축이 풀린 10GB 파일로 빨리 채워진다는 것입니다.
zcat
일시 중지 하거나 한 번에 한 줄씩 읽고 사용자가 지시할 때만 진행하도록 지시 할 수 있습니까 ?
답변1
다음은 매뉴얼 페이지에서 인용되었습니다.파이프(7).
파이프 용량
파이프라인의 용량은 제한되어 있습니다. 파이프가 가득 차면 write(2)는 O_NONBLOCK 플래그 설정 여부에 따라 차단되거나 실패합니다(아래 참조). 구현마다 파이프라인 용량에 대한 제한이 다릅니다. 애플리케이션은 특정 용량에 의존해서는 안 됩니다. 애플리케이션은 읽기 프로세스에서 데이터가 사용 가능해지는 즉시 이를 사용하여 쓰기 프로세스가 차단된 상태로 유지되지 않도록 설계해야 합니다.
2.6.11 이전의 Linux 버전에서는 파이프 용량이 시스템 페이지 크기(예: i386의 4096바이트)와 동일했습니다. Linux 2.6.11부터 파이프 용량은 65536바이트입니다.
이 파이프에는 특정 용량이 있는데, 최신 Linux 커널의 경우 아마도 64k일 것입니다. 해당 용량에 도달하면 읽기 호출 후 공간을 사용할 수 있을 때까지 모든 쓰기가 차단됩니다. 따라서 일반적으로 zcat your_file.gz | your_program
특정 시간에 압축되지 않은 파일은 64k만 있으므로 메모리 사용량에 대해 걱정할 필요가 없습니다.
답변2
애플리케이션이 파일을 읽기만 하고 파일을 읽지 않도록 설정된 경우 stdin
프로세스 대체를 사용할 수 있습니다. 이는 파이프처럼 기능하지만 쉘은 이를 애플리케이션에 파일로 제공합니다. 대부분의 최신 쉘은 이 기능을 제공하지만 POSIX는 그렇지 않습니다. 예는 다음과 같습니다.
yourscript <(zcat filename)
답변3
당신은 그것을 사용할 수 있습니다PVzcat으로 전송된 속도 제한 데이터입니다.
pv -L 5k -q < test.gz | zcat