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 回答