Главная страница
    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.008 c
3-45202
RDK
2002-09-23 10:29
2002.10.14
таблица PARADOX


1-45278
LOAD
2002-10-01 18:44
2002.10.14
Даты


6-45493
Бамбук
2002-08-06 22:13
2002.10.14
Помогите разобрать пример, пожалуйста


1-45409
Tpol
2002-10-02 11:34
2002.10.14
TreeView


4-45627
Delphi 5.01
2002-08-30 09:07
2002.10.14
Problema s TFIleStream!





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский