Delphi - запись большого динамического массива на диск с использованием потока
В программе 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 089 КБ.
Я делаю что-то неправильно? Есть ли ограничение на размер, который можно записать сразу (около 3ГБ)?
1 ответ
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;
Дополнительным преимуществом является то, что вы можете легко отображать прогресс.