Разве это не размер Delphi TFileStream WriteBuffer Int64?Я могу писать только небольшие суммы за раз - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь записать большие куски, чтобы увеличить скорость сохранения файла.У меня есть около 9 из этих циклов для преобразования, но я не могу понять, что я делаю неправильно

fs := TFileStream.Create(Myfile, fmCreate);

Этот код работает:

for RecordGroup := 0 to TotalGroups - 1 do
begin
  for RecordNumber := 0 to Length(MyArray[RecordGroup]) - 1 do
  begin
    fs.WriteBuffer(MyArray[RecordGroup,RecordNumber],SizeOf(MyRecord));
  end;
end;

Когда я удаляю внутреннюю петлю вписать большие куски, код не работает:

for RecordGroup := 0 to TotalGroups - 1 do
begin
  fs.WriteBuffer(MyArray[RecordGroup],SizeOf(MyRecord) * Length(MyArray[RecordGroup]));
end;

Я получаю общую ошибку «Ошибка записи потока»

Значение SizeOf(MyRecord) * Length(MyArray[RecordGroup]) равно 180 * 152,004 = 27,360,720

Все, что я прочитал, в основном говорит, что это правильно.Есть идеи, что я делаю не так?

Заранее благодарим вас за любые идеи, которые вы можете иметь.

1 Ответ

0 голосов
/ 26 февраля 2019

Изменить код записи на (обратите внимание на дополнительные 0 в квадратных скобках)

fs.WriteBuffer(MyArray[RecordGroup, 0],   SizeOf(MyRecord) * Length(MyArray[RecordGroup]));

Ошибка при использовании неверного динамического массива.Я предполагаю, что MyArray - это двумерный массив, поэтому MyArray[RecordGroup] - это одномерный динамический массив - по сути, указатель на данные - но нетипизированный var-параметр WriteBuffer требует использования тела данных массива.


Обратите внимание: ваш счетчик цикла for изменяется от 0 до TotalGroups, поэтому общее число циклов равно TotalGroups + 1.Это правильно?

...