2

Delphi プログラムでは、4,000,000,001 カーディナルを持つ動的配列があります。私はそれをドライブに書き込もうとしています(そして後で読み込もうとしています)。私は以下を使用しました:

const Billion = 1000000000;

stream := tFileStream.Create( 'f:\data\BigList.data', fmCreate);
stream.WriteBuffer( Pointer( BigArray)^, (4 * billion + 1) * SizeOf( cardinal));
stream.free;

それは次のように爆撃しました: ...「ストリーム書き込みエラー」というメッセージで例外クラス EWriteError を発生させました。

書き込んだファイルのサイズはわずか 3,042,089KB です。

私は何か間違ったことをしていますか?一度に書き込めるサイズ(3GB程度)に制限はありますか?

4

1 に答える 1

5

CountパラメーターWriteBufferは 32 ビット整数であるため、そのパラメーターに必要な値を渡すことはできません。への複数の別個の呼び出しを含むファイルを書き込む必要がありますWriteBuffer。各呼び出しは、この制限を超えないカウントを渡します。

このように書くことをお勧めします。

var
  Count, Index, N: Int64;
.... 
Count := Length(BigArray);
Index := 0;
while Count > 0 do begin
  N := Min(Count, 8192);
  stream.WriteBuffer(BigArray[Index], N*SizeOf(BigArray[0]));
  inc(Index, N);
  dec(Count, N);
end;

追加の利点は、進行状況を簡単に表示できることです。

于 2017-07-05T04:34:47.950 に答える