Delphi - 使用流将大型动态数组写入磁盘

Jud*_*nie 2 arrays delphi dynamic tstream

在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;
Run Code Online (Sandbox Code Playgroud)

它轰炸了:...引发异常类EWriteError,消息'Stream write error'.

它写的文件大小只有3,042,089KB.

难道我做错了什么?一次可写的大小是否有限制(约3GB)?

Dav*_*nan 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;
Run Code Online (Sandbox Code Playgroud)

另一个好处是您可以轻松显示进度.