Delphi - 使用流将大型动态数组写入磁盘
Delphi - writing a large dynamic array to disk using stream
在一个 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;
它炸毁了:...引发异常 class EWriteError 消息 'Stream write error'。
它写入的文件大小只有3,042,089KB。
我是不是做错了什么?一次可以写入的大小有限制吗(大约3GB)?
WriteBuffer
的 Count
参数是 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;
另一个好处是您可以随时显示进度。
在一个 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;
它炸毁了:...引发异常 class EWriteError 消息 'Stream write error'。
它写入的文件大小只有3,042,089KB。
我是不是做错了什么?一次可以写入的大小有限制吗(大约3GB)?
WriteBuffer
的 Count
参数是 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;
另一个好处是您可以随时显示进度。