Форум: "Основная";
Текущий архив: 2002.10.14;
Скачать: [xml.tar.bz2];
ВнизОЧень медленно читается типизированный файл. В чем ошибка (+) Найти похожие ветки
← →
Борис (2002-10-04 17:03) [0]Всем привет!
Очень медленно читается типизированный файл (вообще-то это обычный экзешник, или любой ругой файл). Например размером 3 Мб. читается 02 минуты 07 секунд и 370 мс.
Вот исходник:
function TForm1.test(path_file:string; var s:string):cardinal;
var data:array of byte;
i:cardinal;
d:tdatetime;
f : file of byte;
size:cardinal;
begin
AssignFile(f, path_file);
Reset(f);
d:=now;
size:=FileSize(f);
ProgressBar1.Max:=size;
setlength(data,size);
for i:=0 to size-1 do
begin
read(f,data[i]);
application.ProcessMessages;
// ProgressBar1.Position:=i;
end;
// ShowMessage("Вычисляем CRC");
// test:=CalculateCRC32(data[0],Size);
s:=formatdatetime("hh:nn:ss;zzz",now-d);
ProgressBar1.Position:=0;
CloseFile(f);
end;
P.S. Тачка celeron 500 + 256 Mb RAM
← →
Song (2002-10-04 17:06) [1]Application.ProcessMessages тормозит цикл
← →
Smithson (2002-10-04 17:06) [2]Используй BlockRead
← →
Anatoly Podgoretsky (2002-10-04 17:14) [3]Тормозит не Application.ProcessMessages, а по байтовое чтение, вообще очень не рациональный алгоритм.
Проще выделить память под буффер и одной командой Read все прочитать, при том вместо типизированного файла использовать TFileStream, и тогда в зависимости от винчестера от долей секунды до нескольких секунд. Можно и в цикле но большими порциями.
← →
Борис (2002-10-05 09:23) [4]Smithson
Так BlockRead для нетипизированных файлов, или я ошибаюсь?
Делаю так:
var data:array of byte;
i:cardinal;
d:tdatetime;
f : file{ of byte};
begin
AssignFile(f, path_file);
Reset(f);
d:=now;
size:=FileSize(f);
ProgressBar1.Max:=size;
setlength(data,size);
BlockRead(f,data,SizeOf(data));
В чем ошибка, и если можно, как исправить?
← →
TTCustomDelphiMaster (2002-10-05 09:39) [5]Не надо обновлять ProgressBar после каждого байта. Обновляйте его после обработки 1% файла.
← →
ЮЮ (2002-10-05 11:52) [6]1)Ошибка в том, что data - указатель, SizeOf(data)=4, а читать по адресу data вообще нельзя.
2) Reset(f,1);
3) Теперь ты пытаешься прочитать в память всё сразу. Может лучше всё же воспользоваться FileStream-ом ? А в память лучше закачать:
MemoryStream.LoadFromFile
← →
KaPaT (2002-10-05 11:53) [7]> Так BlockRead для нетипизированных файлов, или я ошибаюсь?
BlockRead -для любого типа файлов подойдет...читает заданный размером кусок файла, начиная с указателя...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.10.14;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c