0

読むべき巨大なファイルがあります。ディスクからデータ (4mb) を読み取り、6 つの要素 (それぞれ 4mb) の円形配列に格納する IO スレッドがあります。循環バッファーから読み取り、データをいくつかのレコードに変換する別のスレッドがあります。

問題は、2 つの異なるバッファーにまたがるレコードを持つことができることです (つまり、レコードが最初のバッファーの終わりから始まり、次のバッファーの始まりまで拡張できるとします)。

このような場合はどのように処理すればよいですか?

いくつかのサンプル実装を指摘していただけますか?

4

2 に答える 2

0

レコードが 2 つのバッファーにまたがる場合、バッファーから読み取る関数は次のバッファーから読み取る必要があります。

より正確には、バッファ内のデータからレコードを組み立てる関数を作成します。レコードが終了する前にデータ ポインターがバッファーの末尾に達した場合は、データ ポインターを次のバッファーの先頭に設定します。

うーん、これはより一般的に適用できるようです。データ ポインターから読み取って項目を作成します。データポインタにアクセスする前に、バッファの終わりを確認してください。ポインターがバッファーの末尾を超えている場合は、次のバッファーの先頭に設定します。この概念は、バッファリングされた I/O に非常に似ています。うーん、おそらく iostream を変更するか、独自の iostream を作成して、cin やファイルの代わりにバッファーからデータをフェッチすることができます。を見てくださいstd::istringstream

于 2013-03-05T00:51:22.647 に答える
0

レコードの読み取りプロセスを次のステップに分割する必要があります。

  1. バッファチェーンを入力ストリームに変換します
  2. 入力ストリームを解析してレコードを生成する

標準クラスを使用して、トーマスが言ったように最初のステップを達成するか、独自のソリューションを実装できます。簡単な解決策は次のようになります (レコードの固定サイズを想定)

class BufferReader{
...
public :
   // this function will read data from buffers. 
   // size of readed data is arbitrary and does not depend on buffer size
   // it will return -1 when eof reached, readed size in other case 
   int readData(char *data, int length);
...
}

次に、レコードを解析できます。

int size = /* size of the record */;
BufferReader br(/* some construction parameters here */)
char data[size];
while(br.readData(data, size) == size){
   // parse your data to fill your record
...
于 2013-03-05T10:11:06.493 に答える