2017-02-09 24 views
0

私は、特定のサイズのチャンクでのみ意味のあるデータを含むファイルを持っています。このチャンクは、各チャンクの先頭に追加されます。ファイルから読み込まれたデータに応じて、ダイナミックバッファサイズの大きなファイルを読み込む方法。

{chunk_1_size} 
{chunk_1} 
{chunk_2_size} 
{chunk_2} 
{chunk_3_size} 
{chunk_3} 
{chunk_4_size} 
{chunk_4} 
{chunk_5_size} 
{chunk_5} 
. 
. 
{chunk_n_size} 
{chunk_n} 

ファイルが本当に本当に大きな〜2ギガバイトで、チャンクサイズは(私が持っているしたいのバッファである)〜20メガバイト

である私は数を減らすために、このファイルをバッファリードしたいと思います実際のハードディスクへの呼び出し。

しかし、チャンクサイズが異なる可能性があるため、どれだけのバッファがあるかわかりません。私は心の中に持っているものの

擬似コード:

  1. 第一のバッファがchunkSize_1 + chunk_1 + partialChunk_2が含まれています

    while(!EOF) { 
        /*chunk is an integer i.e. 4 bytes*/ 
        readChunkSize(); 
        /*according to chunk size read the number of bytes from file*/ 
        readChunk(chunkSize); 
    } 
    

    私はランダムなバッファサイズを持って言うことができますならば、私のような状況にクロールするかもしれません---残りの部分を追跡し、次のバッファから残っているチャンクを取得し、残りの部分に連結してチャンクを完成させる必要があります。

  2. 最初のバッファにはchunkSize_1 + chunk_1 + partialChunkSize_2整数、つまり4バイトなので、最初のバッファから2つしか得られないと言うことができます)---私はpartialChunkSize_2を追跡し、次のバッファから次のチャンクサイズを返す整数を返す必要があります。
  3. バッファも一度に一つの全体のチャンクを取得することができない可能性があります - 最初のチャンクが完全にメモリ

答えて

0

に読み込まれるまで、私はあなたが呼び出しの数の上に多くの制御を持っていない読んで打つ維持する必要がありますハードディスクに保存します。ハードディスク(OS、ドライバ、ハードウェアのバッファリング)の間には、制御できない複数のレイヤーがあります。

になるまで、バッファサイズに直接関係するパフォーマンス上の問題がある場合を除き、Javaコード(1M)で適切なバッファサイズを設定してください。言い換えれば、premature optimizationのトラップには入り込まないでください。

は、データを読み取るために、いくつかの分析を行うと、平均的なバッファサイズのアイデアを持っている必要がありますもhttps://stackoverflow.com/a/385529/18157

+0

私がテストしたところによると、20 MBは私のマシンとサーバマシンでも非常に高速でした。私はファイルを2回連続して読み込む、つまりバッファに読み込む間に持っているすべてのバンドエイドに満足していません。 –

0

を参照してください。 バッファサイズを保持し、チャンクが完了するまでデータを読み取って、何らかの意味でフルデータを持たせようとしています ファイルを別の場所にコピーするか、このデータを別の場所に送りますか?いくつかのアクティビティでは Java NIOパッケージは、データをjvmバッファに読み込むのではなく、処理する方が優れています。 バッファサイズは、最大データチャンクを読み込むのに十分な大きさでなければなりません。 メモリでデータを保持する予定の場合、バッファを使用してデータを読み込み、メモリに保持することはメモリコスト操作であり、オペレーションをフラッシュする。 また、apache file-utilsでデータを読み書きすることを確認してください。

+0

Java NIOを使用するのは気になりませんが、私はあまりにも自信がないので、このケースではオプションかどうかを判断できません。このダッシュボードを使用して、レポートダッシュボードのUIに表示します。 –

+0

解凍しようとすると、すべてのデータを弾性検索のような外部アプリにストリームし、それらをインデックスに表示するようにします ヘイゼルキャスト/何度もハードディスクにぶつかることなく(jvmとJavaプログラムのosとして)、no-ofヒットを決定します。 注:NIOのパフォーマンスは、基盤となるOSと操作しようとしている操作に依存しますdo – Fryder

+0

私はこの提案に感謝しますが、私が現在持っているリソースを使って、実装の選択肢を実際に拡張することはできません。 –

関連する問題