Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.009 c
1-45423
Kacnep
2002-10-03 13:08
2002.10.14
Цвет в TreeView


3-45235
Карелин Артем
2002-09-24 11:38
2002.10.14
FireBird. Чтение записи из другой таблицы в триггере.


3-45230
Praco
2002-09-24 09:47
2002.10.14
В DataModule, в инспекторе объектов исчезают ссылки на обработчик


1-45302
кондратий
2002-10-04 17:38
2002.10.14
Not enough timers available.


14-45503
wicked
2002-09-17 22:21
2002.10.14
медицина в стиле technical support :)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский