私は、特定のサイズのチャンクでのみ意味のあるデータを含むファイルを持っています。このチャンクは、各チャンクの先頭に追加されます。ファイルから読み込まれたデータに応じて、ダイナミックバッファサイズの大きなファイルを読み込む方法。
{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メガバイト
である私は数を減らすために、このファイルをバッファリードしたいと思います実際のハードディスクへの呼び出し。
しかし、チャンクサイズが異なる可能性があるため、どれだけのバッファがあるかわかりません。私は心の中に持っているものの
擬似コード:
- 第一のバッファが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); }
私はランダムなバッファサイズを持って言うことができますならば、私のような状況にクロールするかもしれません---残りの部分を追跡し、次のバッファから残っているチャンクを取得し、残りの部分に連結してチャンクを完成させる必要があります。
- 最初のバッファにはchunkSize_1 + chunk_1 + partialChunkSize_2整数、つまり4バイトなので、最初のバッファから2つしか得られないと言うことができます)---私はpartialChunkSize_2を追跡し、次のバッファから次のチャンクサイズを返す整数を返す必要があります。
- バッファも一度に一つの全体のチャンクを取得することができない可能性があります - 最初のチャンクが完全にメモリ
私がテストしたところによると、20 MBは私のマシンとサーバマシンでも非常に高速でした。私はファイルを2回連続して読み込む、つまりバッファに読み込む間に持っているすべてのバンドエイドに満足していません。 –