Разве это не размер Delphi TFileStream WriteBuffer Int64? Я могу писать только небольшие суммы за раз

Я пытаюсь написать более крупные фрагменты, чтобы увеличить скорость сохранения файла. У меня есть около 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;

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

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 в квадратных скобках)

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

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


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

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