|
Вопрос # 1 732/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
использую XML-парсер, собранный через стандартный тулз Delphi7 - XML Data Binding (работает через модули xmldom, XMLDoc, XMLIntf). На скорость работы с файлами на жестком диске не жалуюсь - меньше секунды и готово. А вот напрямую через интернет оставляет желать лучшего ~ 10 секунд. Размер xml всего 2 кб, ширина интрнет канала позволяет скачивать такие размеры за доли секунды. Прошу меня просветить, почему такая ерунда происходит и как можно повысить скорость.
п.с. загружаю файлы через LoadXMLDocument(FileName), где FileName - прямая ссылка на xml-файл в интернете.
 |
Вопрос задал: 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 (статус: Посетитель), 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 (статус: Посетитель), 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 (статус: Посетитель), 28 июня 2008, 12:50 [#4]:
Спасибо, Вадим! Попробую! Правда с XML Data Binding хрен разберешь, где загрузка, где что....
|
|
Вадим К (статус: Академик), 28 июня 2008, 14:54 [#5]:
не употребляйте грубых выражений.
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|