私は組み込みシステムを開発しており、継続的なメモリ制限のために「即時」ログファイルを圧縮する必要があります。
私の目標は、次のようにスクリプトにコード行を追加することです。
(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行ずつ圧縮しますか?可能ですか?
答え1
たぶん標準出力バッファが出力を遅らせている可能性があります。パイプバッファは次のとおりです。かなり大きい、通常は最大数行です。できることを確認したい場合があります。障害を負うそれ。
1行ずつ圧縮すると、何も実行されず、ファイルサイズが大きくなる可能性があります。gzip
(目安として収縮)と他のほとんどの圧縮アルゴリズムはかなり大きなスライドウィンドウで動作し、持つ(出力バッファとは別に)大量の過去のデータを保存すると、実際には何でも圧縮されます。ほとんどの圧縮は過去のデータを参照するために発生します(通常、間接的に最も一般的なシーケンスを見つけて、出力に最も短いコードを提供します)。圧縮率とメモリ消費の間にバランスがあります。正しく圧縮するには、現在の辞書を保持するメモリ内データ構造が必要です。また、バイト単位ではなくチャンク単位で動作するため、十分な入力が収集されるまで操作は続行されません。
圧縮率を設定する番号付きパラメータが有効であることを確認してください(gzip -3
私のシステムでは、デフォルトの6ではなくレベル3の場合)。いくつかの実装とアルゴリズムには追加の設定があります(bzip2 -s
メモリ使用量を減らすために - システムで利用可能な場合は試してください)。
全体的に gzip
追加のバッファリングがあるかどうかはわかりません。私はbusyboxの実装のソースコードをチェックしていませんが、アルゴリズムが必要とするよりもはるかに高いべきではないと思います。ストリームバッファが主なボトルネックかどうか疑われます。