Запись на HD больших файлов [РЕШЕНО]

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Alex2013
долгожитель
Сообщения: 3230
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

Владимир писал(а):Laz 2.2.4, FPC 3.
Я спрашивал о том в какой код программа компилируется то есть в 32-х разрядный или в 64-х разрядный.
( Версия достаточно свежая и это хорошо но основной параметр дающий резко различные результаты это разрядность получаемого на выходе кода)
xchgeaxeax
постоялец
Сообщения: 207
Зарегистрирован: 11.05.2023 02:51:40

Сообщение xchgeaxeax »

Alex2013 писал(а):Еще одна возможная причина:
BlockRead и BlockWrite это легаси функции так что возможно что их просто никто не проверял на работу с большими файлами в современных ОС. Так что попробуй работать через TFileSteam
Простейший способ.
А вы во внутренности посмотрите

Код: Выделить всё

Procedure BlockRead(var f:File;var Buf;Count:Int64;var Result:Int64);[IOCheck];
{
  Read Count records from file f ro Buf, return number of read records in
  Result
}
Begin
  Result:=0;
  If InOutRes <> 0 then
   exit;
  case FileRec(f).Mode of
    fmInOut,fmInput :
      Result:=Do_Read(FileRec(f).Handle,@Buf,count*FileRec(f).RecSize)
        div FileRec(f).RecSize;
    fmOutput: inOutRes := 104;
    else InOutRes:=103;
  end;
End;
BlockRead -> Do_Read

Код: Выделить всё

Function Do_Read(Handle:thandle;Addr:Pointer;Len:Longint):Longint;

var j:cint;

Begin
  repeat
    Do_Read:=Fpread(Handle,addr,len);
    j:=geterrno;
  until (do_read<>-1) or ((j<>ESysEINTR) and (j<>ESysEAgain));
  If Do_Read<0 Then
   Begin
    Errno2InOutRes;
    Do_Read:=0;
   End
  else
   InOutRes:=0;
End;
Do_Read -> Fpread

Код: Выделить всё

function Fpread(fd: cint; buf: pchar; nbytes : size_t): ssize_t; [public, alias : 'FPC_SYSC_READ'];
{ const
  syscall_nr_read                                = 0; // SYS_READ системный вызов Linux X64 }
begin
  Fpread:=do_syscall(syscall_nr_read,Fd,TSysParam(buf),nbytes);
end;
И после трёх вложенных вызовов мы попадаем ...
... мы попадаем ...
на системный вызов. Куда уж более прямой способ работы с файлами.

2 Владимир. Странно, что у вас запись в файлы обрывается. Вообще функции используют напрямую системные вызовы. Возможно на ФС куда вы пишите файл установлены квоты. Хотя, если их не настраивать, то ничего такого обычно не бывает. Вообще надо разбираться конкретнее. С каким кодом ошибки завершается цикл чтения-записи?
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Сообщение Владимир »

Alex2013 писал(а):Я спрашивал о том в какой код программа компилируется то есть в 32-х разрядный или в 64-х разрядный.
64 разряда
НО новый поворот: исходный код работает - взял другую флешку 8Гб - полет нормальный.
Догадался выполнить dd на битой флешке, получил ошибку как раз на 4,2 Гб. Не очень понятно в этом смысле сообщение Лазаруса Disc FULL,
Выполнил dd на исправной флешке, получил файл 7,7 Gb 7,2 Gib (вывод dd) или 7386 Гб, моя функция дала файл 7205 Гб.
xchgeaxeax
постоялец
Сообщения: 207
Зарегистрирован: 11.05.2023 02:51:40

Сообщение xchgeaxeax »

Странно. Проверил у себя работу BlockRead / BlockWrite. У меня Calculate Linux 5.15 на реальной машине
Screenshot_20230624_223720.png
Screenshot_20230624_223823.png
Надо посмотреть как она будет работать с флешкой. Но её сейчас нету под рукой, а в системе только один диск.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Сообщение Владимир »

[quote="xchgeaxeax"]Странно. Проверил у себя работу BlockRead / BlockWrite. У меня Calculate Linux 5.15 на реальной машине
Насчет разного размера файлов dd и нашей функции: все правильно.
Вставили флешку, прочитали-записали. Затем сравнили размеры полученного файла и /dev/sdb - получили разницу, т.к. система сама подмонтировала флешку и ее размер изменился.
ВСЕМ СПАСИБО!!!
Ответить