ブロックバッファリングなしで標準出力を圧縮する方法

ブロックバッファリングなしで標準出力を圧縮する方法

私はこれを試しました

myprogram | gzip > /var/log/mylog.log

私が理解したところ、ログファイルはgzipチャンク全体(32kBのようです)が作成されたときにのみ記録されます。これにより、ディスクに書き込むときにかなりの待ち時間が発生する可能性があります。システムがクラッシュすると、ログの最後の部分が失われます。

バイトが到着するとすぐに圧縮して書き込むgzipの代替案はありますか?ブロックベースではなくバイトストリームベースの圧縮アルゴリズムもあるようですが、そのようなツールがあるかどうかは調べられません。

ベストアンサー1

私が理解したところ、ログファイルはgzipチャンク全体(32kBのようです)が作成されたときにのみ記録されます。

まあ、コンプレッサーの使命は、多くのビットを取り、より少ないビットを生成することです。したがって、一部のブロック固有の操作は基本的に一意です。最後に、Lempel-Zivに似たもの(gzipと同じですが、他のほとんどのコンプレッサーに似ています)は、コードブックでシンボルを見つけることを行います。コードブックとの一致が完了するまでシンボルが見つかったかどうかを確認できます。

これはコードブックの定期的なリセットと組み合わせて、比較的固定されたブロック長をもたらします。 (例:gzipではブロックサイズを選択できません。ブロックサイズの選択はgzip圧縮方法に固有です。)

  • gzip以下より少し古いものを使用できます。たぶんxzこれは--flush-timeoutあなたが本当に探しているものかもしれません。

  • 32kBが「多くのログ」と思われる場合、圧縮はまったく必要ありませんか?実際、logrotateのようなメカニズムはまさにこのパスに従います。つまり、数メガバイトごとに新しいログに切り替え(最新のコンピュータにはあまりデータがない)、古いファイルのみを圧縮します。

  • さらに、平均ファイルシステムおよびブロックデバイス階層バッファは32kBよりはるかに大きい。ファイルシステムをfsyncマウントモードにしておく必要がありますが、ストレージデバイスの物理ブロックが実際に常にストレージメディアにフラッシュされている場合は、Smallerが4kB(またはその倍数)になる可能性があることを忘れないでください。パフォーマンスに深刻な影響を与える可能性があります。

おすすめ記事