Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.09.07;
Скачать: [xml.tar.bz2];

Вниз

Скорость чтения и обработки из файла   Найти похожие ветки 

 
ванъка   (2008-07-26 12:41) [0]

У меня есть собственный формат файла в котором я храню маленькие картинки (общий размер файла с картинками - 150 Кб), там около 60 картинок.

Формат файла:
заголовок с указанием кол-ва картинок в файле
а дальше идет необходимое кол-во картинок у каждой заголовок:
тип картинки: Byte;
размер картинки: Int64;
дальше сами данные.


А в программе я считываю такой файл и в зависимости от типа картинки заполняю нужный ImageList. Но у меня проблема - загрука очень долгая - около 10 секунд, это нормально?

Считываю через TFileStream и TMemoryStream.


 
{RASkov} ©   (2008-07-26 13:17) [1]

> [0] ванъка   (26.07.08 12:41)
> загрука очень долгая - около 10 секунд, это нормально?

Просто считать 150 кб данных и разместить их по разным контейнерам за такое время на современных компьютерах - не нормально. Т.е. долго...


 
ванъка   (2008-07-26 13:25) [2]

Ну у меня старый компьютер (P-III, 128 Мб оперативки), но мне кажется, что это все равно долго для считывания данных.

Что может быть плохо в моем коде? (тут приведен сам алгоритм считывания)

             for i := 0 to ImagesCount - 1 do
             begin
               FS.Read(ImageHdr, SizeOf(TThemeBinaryHdr));
               MS := TMemoryStream.Create;
               try
                 with ImageHdr do
                 begin
                   MS.CopyFrom(FS, ImgSize);
                   MS.Seek(0, soFromBeginning);
                   PngObj := TPNGObject.Create;
                   try
                     PngObj.LoadFromStream(MS);
                     if Length(Images) - 1 >= ImgType then
                       Images[ImgType].PngImages.Add.PngImage := PngObj;
                   finally
                     PngObj.Free;
                   end;
                 end;    
               finally
                 MS.Free;
               end;
             end;


 
Loginov Dmitry ©   (2008-07-26 14:05) [3]

> Ну у меня старый компьютер (P-III, 128 Мб оперативки), но
> мне кажется, что это все равно долго для считывания данных.
>
> Что может быть плохо в моем коде? (тут приведен сам алгоритм
> считывания)


подозреваю, что основное время уходит на
                  PngObj := TPNGObject.Create;
                  try
                    PngObj.LoadFromStream(MS);
                    if Length(Images) - 1 >= ImgType then
                      Images[ImgType].PngImages.Add.PngImage := PngObj;
                  finally
                    PngObj.Free;
                  end;


хотя если компьютер старенький, не исключены тормоза с жестким диском.

ОС какая?


 
ванъка   (2008-07-26 14:46) [4]

Начинает все тормозить (долго загружать) в этом месте:
Images[ImgType].PngImages.Add.PngImage := PngObj;

т.е. без этой строчки считывание происходит буквально за секунду, значит со считыванием с жесткого диска все ок. Проблема в заполнении Images. Images — это массив сосотоящий из специальных листов: TPngImageList.

Что бы попробовать исправить?


> ОС какая?

2003


 
ванъка   (2008-07-26 15:29) [5]

Я посмотрел про свой TPngImageList и внес изменения в код загрузки, и засек через GetTickCount время исполнения, получилось в два раза быстрее.

Для нового алгоритма получилось общее время обработки: ~3000 мс. Как по вашему - это уже нормально или нет?


 
{RASkov} ©   (2008-07-26 15:41) [6]

> [5] ванъка   (26.07.08 15:29)
> ~3000 мс. Как по вашему - это уже нормально или нет?

Много :) т.е. долго...
Для 150 Кб... причем из файла своего формата... т.е. структурированного(адаптированного) для своих задач...
:о)
Может у тебя в момент загрузки еще какие действия происходят, например визуализация той самой загрузки с математическими расчетами чего либо...


 
{RASkov} ©   (2008-07-26 15:44) [7]

Да и ось тяжеловата для твоей машинки.... имхо.
Как остальное-то ПО работает? не тормозит?


 
ванъка   (2008-07-26 15:54) [8]

Специально для тестов делал новый-чистый проект, в нем одна только процедура загрузки из файла и добавления в image-листы. У меня тормозит только в одном месте — в месте добавления изображения из MemoryStream в image-лист. Без этого добавления вся операция занимает ~10 мс.

> Как остальное-то ПО работает? не тормозит?

Ну так конечно подтормаживает, но у меня открыта только сама delphi и больше никаких процессов вроде файерволлов и антивирусов. В таком случае под delphi спокойно можно работать.


 
Riply ©   (2008-07-26 16:15) [9]

> [0] ванъка   (26.07.08 12:41)
> У меня есть собственный формат файла в котором я храню маленькие картинки
> (общий размер файла с картинками - 150 Кб), там около 60 картинок.

А ты случаем не с дискеты читаешь ? :)

P.S.
Алгоритм загрузки плохой - переделай (вынеси все из цикла, например TMemoryStream.Create, PngObj := TPNGObject.Create;).


 
{RASkov} ©   (2008-07-26 16:17) [10]

> [8] ванъка   (26.07.08 15:54)
> в месте добавления изображения из MemoryStream в image-лист.
> Без этого добавления вся операция занимает ~10 мс.

Ну значит "ошибочное" место там...

> Images — это массив сосотоящий из специальных листов: TPngImageList.

Что за TPngImageList? Получается, что в его коде - тормоза.
И вообще как-то вот это:

>     Images[ImgType].PngImages.Add.PngImage := PngObj;
>   finally
>     PngObj.Free;

подозрительно, хотя подозрения могут быть только визуально) Я в плане Assign
...или например вообще убрать

> PngObj := TPNGObject.Create;
....
PngObj.Free;

А сделать так:
   if Length(Images) - 1 >= ImgType then
      Images[ImgType].PngImages.Add.PngImage.LoadFromStream(MS);


 
ванъка   (2008-07-26 16:39) [11]


> А ты случаем не с дискеты читаешь ? :)

Нет, читаю с жесткого диска.


> Что за TPngImageList? Получается, что в его коде - тормоза.

TPngImageList — из библиотеки PngComponents: http://www.thany.org/article/18/VCL
Возможно конечно и внутри нее тормоза, но мне кажется что это хорошая библиотека и тормоза где-то у меня.


> подозрительно, хотя подозрения могут быть только визуально)
> Я в плане Assign

Я изменил код, убал этот PngObj и сделал именно так: Images[ImgType].PngImages.Add.PngImage.LoadFromStream(MS);,
кроме того по совету выше убрал из цикла MS.Create / Free, но это совсем никак не сказалоь на скорости выполнения. (ну теперь ~2900 мс).


 
{RASkov} ©   (2008-07-26 16:52) [12]

> [11] ванъка   (26.07.08 16:39)
> Возможно конечно и внутри нее тормоза, но мне кажется что
> это хорошая библиотека и тормоза где-то у меня.

наивный :) Хотя точка зрения вполне в праве... и я с ней согласен. Т.е. прежде чем кого-либо винить, ищи грех у себя....
Но тут вроде как все указывает на класс TPngImageList, так как ты говоришь, что комментируешь всего лишь одну строчку с "чужим" кодом и это сказывается на скорости, то тут и нужно разбирать данную строчку.... имхо.

Смотри метод PngImages.Add и еще бы, я внимательно обратил внимание на MS. Что в нем на момент PngImage.LoadFromStream(MS);.


 
ванъка   (2008-07-26 17:12) [13]

Ну вообщем видимо тупость где-то внутри этой библиотеки PNG, не ожидал честно говоря от нее такого.

Я заменил в моем коде LoadFromStream на LoadFromFile и в цикле просто загружал одну и туже картинку с жесткого диска напрямую, ну и это заняло ~4500 мс.

Вот такие вот дела. Буду искать другую библиотеку наверное.


 
ванъка   (2008-07-26 18:06) [14]

Библиоткеа эта права отменная я ее так менять не хотел... И вот, в наборе был кроме TPngImageList еще один любопытный объект — TPngImageCollection (это тоже типа TPngImageList, но может хранить в себе картинки различных размеров), ну я и решил его испробовать. Попробовал добавить в него — моментально добавляется.

Стал копать в исходниках, и нашел интересное место: оказывается при добавлении картинки в TPngImageList, он автоматически делает для копию в другую отрисовку какую то и маску для нее (я не вникал в суть). Я убрал это место и о чудо, у меня все моментально грузиться и работает.
Надо только теперь проверить все ли всегда будет зорошо без убранного мною кода. Всем спасибо кто помогал!


 
tesseract ©   (2008-07-26 18:24) [15]


> Библиоткеа эта права отменная я ее так менять не хотел..
> .


Zlib в ней обнови. Очень тормознутая либа, сам её недавно переписывал. Сделано грамотно, но по скорости шо ппц. И утечечки у неё неплохие. Народ не понимает, что стрbмы надо гасить по raise.


 
ванъка   (2008-07-27 13:07) [16]


> Zlib в ней обнови.

Обновил.

Еще может знаете, внутри TPngImageList, при добавлении картинки внутрь (ну например чере тот же LoadFromStream) каждый раз вызывается процедура CopyPngs, которая абсолютно глупая, она каждый раз переводит заново все картинки в иконки, не только что добавленную переводит, а вообще все в цикле, от этого у меня и стали наблюдаться тормоза.
Но у меня что-то никак не получается переделать эту процедуру (CopyPngs) для того что бы она не проходила в цикле все картинки а только обновляла добавленную картинку.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.09.07;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.004 c
2-1217146595
Newser
2008-07-27 12:16
2008.09.07
Как найти фрагмент текста (дата)?


2-1217251593
alex-drob
2008-07-28 17:26
2008.09.07
Выборка из таблицы по дате


2-1217409328
cyborg
2008-07-30 13:15
2008.09.07
поиск по маске


3-1205271880
GanibalLector
2008-03-12 00:44
2008.09.07
backup/restore Firebird


1-1198227129
Afonya
2007-12-21 11:52
2008.09.07
FastScript доступ к объектам дочерних окон.





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