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;

Дополнительным преимуществом является то, что вы можете легко отображать прогресс.

Другие вопросы по тегам