저는 임베디드 시스템을 개발 중이며 지속적인 메모리 제한으로 인해 "즉시" 로그 파일을 압축해야 합니다.
내 목표는 다음과 같이 스크립트에 코드 줄을 추가하는 것입니다.
(myLaunchScript.sh 2>&1 | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; fflush(); }' | busybox gzip -c > /mnt/persistenMem/log_app.log.gz 2>&1 )&
- awk는 추적에 날짜/시간을 추가하는 도우미입니다. 이렇게 하면 애플리케이션 printf 오버헤드가 줄어듭니다.
문제는 gzip에 내부 버퍼가 있기 때문에 시스템이 예기치 않게 종료되면 이 구현이 출력을 잃는다는 것입니다. 이 내부 버퍼는 busybox가 컴파일된 옵션에 따라 달라질 수 있습니다.
버퍼리스 로직을 구현하는 압축 도구가 있습니까?
아니면 한 줄씩 압축하나요? 가능합니까?
답변1
어쩌면 표준 출력 버퍼가 출력을 지연시키고 있을 수도 있습니다. 파이프 버퍼는 다음과 같습니다.꽤 큰, 일반적으로 최대 몇 줄입니다. 할 수 있는지 확인하고 싶을 수도 있습니다.장애를 입히다그것.
한 줄씩 압축하면 아무 작업도 수행되지 않으며 파일 크기가 커질 수도 있습니다. gzip
(기준으로수축) 및 대부분의 다른 압축 알고리즘은 상당히 큰 슬라이딩 윈도우에서 작동하며 또한가지다(출력 버퍼와 별개로) 많은 양의 과거 데이터를 저장하면 실제로 무엇이든 압축됩니다. 대부분의 압축은 과거 데이터를 참조하는 데서 발생합니다(보통 간접적으로 가장 일반적인 시퀀스를 찾아서 출력에 가장 짧은 코드를 제공합니다). 압축 비율과 메모리 소비 사이에는 균형이 있습니다. 올바르게 압축하려면 현재 사전을 보유하는 메모리 내 데이터 구조가 필요합니다. 또한 바이트 단위가 아닌 청크 단위로 작동하므로 충분한 입력이 수집될 때까지 작업이 계속되지 않습니다.
압축 비율을 설정하는 번호가 매겨진 매개변수가 효과가 있는지 확인하십시오( gzip -3
내 시스템에서는 기본값인 6 대신 레벨 3의 경우). 일부 구현 및 알고리즘에는 추가 설정이 있을 수 있습니다( bzip2 -s
메모리 사용량을 줄이기 위해 - 시스템에서 사용 가능한 경우 시도해 보십시오).
전체적으로 gzip
추가 버퍼링이 있는지 확실하지 않습니다. 나는 busybox 구현의 소스 코드를 확인하지 않았지만 알고리즘이 요구하는 것보다 훨씬 높으면 안 된다고 생각합니다. 스트림 버퍼가 주요 병목 현상인지 의심됩니다.