Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 732

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
использую XML-парсер, собранный через стандартный тулз Delphi7 - XML Data Binding (работает через модули xmldom, XMLDoc, XMLIntf). На скорость работы с файлами на жестком диске не жалуюсь - меньше секунды и готово. А вот напрямую через интернет оставляет желать лучшего ~ 10 секунд. Размер xml всего 2 кб, ширина интрнет канала позволяет скачивать такие размеры за доли секунды. Прошу меня просветить, почему такая ерунда происходит и как можно повысить скорость.

п.с. загружаю файлы через LoadXMLDocument(FileName), где FileName - прямая ссылка на xml-файл в интернете.

Phoenix Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Phoenix (статус: Посетитель)
Вопрос отправлен: 26 июня 2008, 17:52
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Phoenix!
А всё банально просто. Когда вы используете этот парсер xml, то ваше приложение подымает пол операционной системы на уши. Ведь используется технология COM. В принципе сложно уместить всё объяснение в таком маленьком ответе, но просто поймите, что когда начинается использование COM (а это и есть OLE, ActiveX) - это никогда не бывает быстро. Это большой инструмент для решение сложных задач, но медленный.
К тому же, замечено, что когда загружается файл через LoadXMLDocument, то не происходит обычного скачивания, а выполняется проверка, а дотступен ли указанный путь для записи, а нет ли там некоторых дополнительных файлов.
Отсюдова совет. качайте теми же инди/синапсе (в разделе статей есть достаточно материала на эту тему), а потом присваивайте скачанный текст в виде строки этому парсеру. И будет быстро.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 26 июня 2008, 23:54
Оценка за ответ: 5

Комментарий к оценке: понятно все, об этом подумывал...

Мини-форум вопроса

Всего сообщений: 5; последнее сообщение — 28 июня 2008, 14:54; участников в обсуждении: 2.
Phoenix

Phoenix (статус: Посетитель), 27 июня 2008, 01:50 [#1]:

Уважаемый, Вадим К, нашел вашу статью "Скачиваем файлы из интернета", все разобрал, прикрутил к программе. К вам один вопрос - возможно ли, а если да, то как скачать файл и тут же прочитать в одной процедуре. Т.е. есть некая процедура:

d:=TDownLoader.Create(true);
d.URL:=(url);
d.ToFolder:=put;
doun.FreeOnTerminate:=true;
doun.resume;
XML := LoadFile(put);

Я так понимаю, по завершению надо использовать, проедуру thrTerminate, но есть острая необходимость сделать все в одной процедуре.
Phoenix

Phoenix (статус: Посетитель), 27 июня 2008, 03:00 [#2]:

Все, проблема снята, для моих целей удобнее использовать синапс.

И вопрос напоследок:
LoadXMLDocument(FileName)
при загрузке использует файл, а не строку... функцию, которая грузит текст из файла мне не найти.
пока что собрал криво - сохраняю загруженное из синапса текст в файл, а из файла гружу в xml.
прошу совета.
Вадим К

Вадим К (статус: Академик), 28 июня 2008, 01:55 [#3]:

Ну, можно без файла обойтись - сохранять в поток в памяти. где то так
var mem:TMemoryStream;
     sl:TStringList;
begin
sl := TStringList.create;
httpLoad('site.ua',sl);// символическая скачка с помощью синпасе. На сайте есть в статьях
mem:=TMemoryStream.create;
sl.savetostream(mem);
sl.free;
mem.position := 0;
xmlDoc.LoadFromStream(mem);
mem.free;
Код схематический, и можно и к инди применить. Если текст xml есть в виде строки, то можно чуточку иначе
var mem:TStringStream;
s:string;
begin
s  := idhtp.Get('site.ua');
mem:=TStringStream.create(s);
mem.position := 0;
xmlDoc.LoadFromStream(mem);
mem.free;
даже короче получается.
Но помните - это набросок. Эксперементируйте.
Использование потоков в памяти даёт весьма позитивные результаты (не путать с потоками выполнения! Эти потоки, файловые называются Stream. Потоки выполнения - Thread. В русскоязычной литературе ещё называют нитями ну или тредами:) ).
Галочка "подтверждения прочтения" - вселенское зло.
Phoenix

Phoenix (статус: Посетитель), 28 июня 2008, 12:50 [#4]:

Спасибо, Вадим! Попробую! Правда с XML Data Binding хрен разберешь, где загрузка, где что....
Вадим К

Вадим К (статус: Академик), 28 июня 2008, 14:54 [#5]:

не употребляйте грубых выражений.
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 12:00
Выполнено за 0.03 сек.