0

残りのコードが英数字データをファイルに記録するために使用するロギングメカニズムを作成しています。システム内の他のすべてのモジュールは、連続してファイルに書き込まれる英数字の文章(最大で2語)を送信します。キャッチは、私は自分のデータ構造とこれらのログメッセージのメモリ内ストレージに使用するために、あらかじめ割り当てられた少量のメモリしか与えられていないということです。インフローがディスクに書き込めるものより多い場合、ログメッセージは破棄されます。事前割り当てメモリを備えたログモジュール

ログモジュールのクライアントとメモリ間の圧縮メカニズムを入れて、できるだけ多くのメッセージを保存できるようにします。これまで

私の現在の設計:

CLIENT ------>ログモジュール---->圧縮とインメモリで保存バッファ1

ライタースレッド: 書き込む時間が来たら、バッファ2と書き込みバッファ1でバッファ1をファイルに切り替えます。この間、クライアントはバッファ2に書き込みます。外

スクリプト: 解凍およびshowログメッセージ

質問: 私は使用することができます良い英数字圧縮アルゴリズムまたは良好なデータ構造である私は(できるだけ多くのデータをキャプチャするために使用することができます上記の圧縮段階の間)?

可能であれば、中間データ構造に圧縮コードを格納しないアルゴリズムが必要です。つまり、システムがクラッシュした場合、これまでにファイルに書き込まれたものを解凍できるようにしたいと考えています。

今まで試みてください: 私たちが使用するすべてのチャレーターにコードを割り当ててください。それほど柔軟性がないようです。私が使用することができます良い英数字圧縮アルゴリズムまたは良好なデータ構造である私は、圧縮中に(できるだけ多くのデータをキャプチャするために使用することができます。

ログメッセージのほとんどは、単純なテキスト文章

答えて

1

質問です上記のステージ)?

一般的に、アルゴリズムがより低速でメモリーを必要とするほど、圧縮率は向上します。異なるコーデックではトレードオフが異なり、コーデックによっては異なるパラメータを微調整して異なるトレードオフを生み出すこともできます。

コーデックは異なるデータでも非常に異なる傾向があります。いくつかのベンチマークがありますが、これはパフォーマンスの一般的な考え方に過ぎません。あなたがデータをとで試してみて、あなた自身の測定をするのに必要な最高のものを実際に選んでください。

プロセスがクラッシュしたときにデータが失われないように、現在のデザインでは、フラッシングをサポートするストリーミングコーデックが必要です。メッセージのロギングが終了するたびに、コーデックにフラッシュするよう指示する必要があります。このためのAPIは、コーデックに依存するが、通常、あなたが

foo_compress(stream, output, input); 
foo_flush(stream); 
fwrite(stream->output, 1, stream->output_size, file); 
fflush(stream); 

のようなものになってしまいますいくつかのライブラリは、(あなたがfwrite/fflushをスキップすることができます)、ディスクへの書き込み/読み出し用のAPIを提供しています。スカッシュ、gzip、およびlzhamが心に来るが、おそらく他があります。しかし、ほとんどの場合、ライブラリは単にバッファに圧縮され、バッファをファイルに書き込む責任があります。

ここでの主な障害は、多くのアルゴリズムがフラッシングをサポートしていないことになります。私の頭の上から、gzip、lzham、brotli、bzip2、lzma、zstd、そして私はと思う。 lz4fはフラッシングをサポートする。 bzip2は、大量のフラッシュを行うとうまく動作しないかもしれません。新しいシステムであれば、gzipやlzmaを使用する理由はあまりありません(zstdはgzipよりも優れており、brotliとlzhamはほぼすべてでlzmaを上回ります)。方法)。

前記、あなただけの原因あなたコード(すなわち、あなたはときにプログラムがクラッシュしたデータを保存したいが、あなたはOSがクラッシュについてあまり心配していないよ)でクラッシュによるデータ損失を避けるためにしようとしている場合には、圧縮とI/Oコードを別々のプロセスに分割することを検討することをお勧めします。その時点で、syslogに似た何か、あるいはjournaldASL、または驚くほど不愉快なWindows Event Log APIのようなより新しい構造化されたログAPIになります。