2017-09-04 21 views
0

私のアプリケーションはビデオファイルとi2cセンサーデータをできるだけ早くディスクファイルに記録しています。現在、私はすべてをバイトに変換しています。私はBufferedOutputStreamを使って記述しています。 @SiguzaはGzIPOutputStreamを検索してその行為を達成することを示唆するほど親切でした。私は、あなたがパフォーマンス上の問題について何か考えを持っていたのかどうか疑問に思っていました...私はプロセッサが先を見越してディスク書き込みがボトルネックだと思っています - 書き込みが起こる前にGZIPOutputStream良い戦略。これについてのどんな考えも大歓迎です。GZIPOutputStreamとBufferedOutputStreamのパフォーマンス

追加:コメントへの応答で...

はビュン判明高価なそのプロセッサではありません...とアーウィンが正しく指摘したように、私は元の質問をしていた方法は、素晴らしいではありませんでした。圧縮パフォーマンスに関する質問はBufferedOutputStreamとGZIPOutputStreamの間ではありません...圧縮ストリームと圧縮ストリームの両方をBufferedOutputStreamにラップする必要がありますが、オリジナルのFileOutputStreamがGZIPOutputStreamに先立ってラップされている場合は、どれだけのコストが追加されますBufferedOutputStreamにラップされます。ここに答えがあります。 21msで偽= zip形式のファイルサイズ4メガバイト
- - ファイルサイズ4キロバイト

と、私は私の2012年のMacProのラップトップは

38msで真= zip形式の

と1Mのintの書き込みを行うコード

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(); 

を使用していますはい、私は

読み取りもパフォーマンスが

FileInputStream fin = new FileInputStream(datFile); 
0123との間に86ms対ほぼ同じ83です:-)圧縮が好き

GZIPInputStream gin = new GZIPInputStream(new FileInputStream(datFile)); 

いいすべて...

+1

を読みますか?とにかくBufferedOutputStreamとGZIPOutputStreamは全く異なる獣であり、組み合わせることができます。前者は小さな書き込みが多い場合は最適化し、後者は圧縮可能なデータの領域消費を削減し、特殊なビデオコーデックを使用してビデオを圧縮する方がはるかに優れています。彼らは匹敵しない。 –

+0

ファイルが圧縮されているかどうかにかかわらず質問が発生します。ダウンストリームシステムはそれらを圧縮解除できますか? – EJP

+0

私はビデオストリームを圧縮していません。ヘッドアップディスプレイに入る情報や、ストリーム上にオーバーレイされて、それを増強する情報のように、ビデオストリーム自体を圧縮しているわけではありません。データはすべてバイト、整数、文字列です。各レコードは約20バイトです。 10fpsで10分はテキストとして400kB、重要なバイトに縮小すると120kBです。縮小して圧縮した場合は26kBです。帯域幅の節約は間違いなくすばらしく見えますが、パフォーマンスを最適に最適化する方法についての質問は私にはあまり明確ではありません。これは時間が重要ではないので、減圧工程は私の大きな心配ではありません。 –

答えて

1

この質問が提起した問題の全体の多くがあります。

私はプロセッサを考えていますずっと先で、ディスクへの書き込みボトルネックです

"私は思っています"パフォーマンスを最適化するための健全な基礎ではありません。ボトルネックが実際にどこにあるかを調べるには、いくつかの測定を行う必要があります。また

(あなたが、その後GZipOutputStreamに変更するとさらに悪いことしやすい、間違っているの。「思考」した場合)、ちょうどそれがパフォーマンスかを改善するかどうか、それを試してみてください、と対策

理論的には、プロセッサとディスク速度の間に重大な不一致があった場合、圧縮が役立つ可能性があります。また、圧縮がディスク領域を節約できるという可能性もあります。

しかし、欠点は以下のとおりです。

  • 圧縮は比較的高価である(ので、解凍がある)、あなたはI/O
  • 圧縮を減らすことによって獲得されているよりも多くの(経過)時間を使用して終わる可能性がありますので、
  • は、ビデオデータがすでに圧縮されている場合、その後、第2の圧縮がachieます
  • 生(非圧縮)オーディオまたはビデオデータに
  • 形式にとらわれない圧縮は非常に効果的ではない、小さなファイルには効果がありません何もない。

最後に、「たくさんの小さなファイル」問題である可能性があります。たくさんの小さなファイルを読み書きしようとすると、ボトルネックはディスクの生の速度ではないようです。むしろ、ディレクトリやファイルメタデータを読み書きするOSの可能性が高いです。その場所に問題がある場合は、「たくさんの小さなファイル」をアーカイブにまとめることを検討する必要があります。例えばTARまたはZIPファイル。 Javaでこれを行うためのライブラリがあります。

アーカイブのもう1つの利点は、圧縮がより効果的になるということです。


1 - 背景については、テストをしようとするからあなたを停止して何https://en.wikipedia.org/wiki/Lossless_compressionhttps://en.wikipedia.org/wiki/List_of_codecs#Lossless_video_compression

+0

スティーブン、おかげで、まさに私が別のアプローチの長所と短所をもう少し理解する必要があった。私のファイルは、ログ、int、shorts、stringからなる1つの大きなファイルです - 100sのMB合計。それぞれ20バイトの小さな書き込みから多数蓄積されます。私のテストのためのパラメータが何である必要があるか、私にはるかに良いアイデアを与えてくれてありがとう。私はパフォーマンステストを開始して、その場でのジッピングにかかる​​費用を賦課し、私が見つけたものを報告します。 –

関連する問題