私のアプリケーションは、大量のビデオと i2c センサー データをディスク ファイルにできるだけ速く記録しています。現在、私はすべてをバイトに変換しており、BufferedOutputStream で書いています。@Siguza は親切にも、GZIPOutputStream を調べることを提案してくれました。賛否両論のパフォーマンスの問題について何か考えがあるかどうか疑問に思っていました...プロセッサがはるかに進んでおり、ディスク書き込みがボトルネックであると考えています-書き込みの前にGZIPOutputStreamを介してオンザフライで圧縮することを望んでいます良い戦略。これについてのご意見は大歓迎です。
追加: コメントに応じて ...
圧縮はそれほど高価ではないことがわかりました...そして、アーウィンが正しく指摘したように、私が最初の質問をした方法は良くありませんでした。圧縮のパフォーマンスに関する問題は、BufferedOutputStream と GZIPOutputStream の間ではありません...圧縮されたストリームと解凍されたストリームの両方を BufferedOutputStream にラップする必要がありますが、元の FileOutputStream を GZIPOutputStream にラップする前に最初にラップすると、どれだけのコストが追加されますか? BufferedOutputStream にラップされます。ここに答えがあります。コードを使用しています
byte[] bs = RHUtilities.toByteArray((int)1);
boolean zipped = false;
FileOutputStream fos = new FileOutputStream(datFile);
BufferedOutputStream bos = null;
if (zipped) {
GZIPOutputStream gz = new GZIPOutputStream(fos);
bos = new BufferedOutputStream(gz);
} else
bos = new BufferedOutputStream(fos);
long startT = System.currentTimeMillis();
for (int i=0; i<1000000; i++)
bos.write(bs);
bos.flush();
System.out.println(System.currentTimeMillis()-startT);
bos.close();
私の2012年のmacproラップトップは、1M intの書き込みを行います
zipped=true で 38ms - ファイルサイズ 4MB
zipped=false で 21ms - fileSize 4KB
そして、はい、私は圧縮が好きです:-)
読み取りパフォーマンスは、83 ミリ秒と 86 ミリ秒の間でほぼ同じです
FileInputStream fin = new FileInputStream(datFile);
と
GZIPInputStream gin = new GZIPInputStream(new FileInputStream(datFile));
すべて良い...