Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Delphi > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 07.07.2010, 09:07   #1
AndreyF
Пользователь
 
Регистрация: 15.10.2008
Сообщений: 44
Репутация: 10
По умолчанию Выгрузка в Xml

Ребята, Добрый день!
Написал выгрузку из базы данных (firebird) в xml файл.
Записей порядка 100 000, выгружаю всего два поля.
вот мой код:
Код:

procedure TFBASIC.Button1Click(Sender: TObject);
var XmlDocument: IXMLDocument; i:Integer;
begin
   XmlDocument:=TXMLDocument.Create(nil);
   with XmlDocument do
      begin
         Active:=true;
         Version:='1.0';
         Encoding := 'Windows-1251';
         Options:=Options+[doNodeAutoIndent];
         DocumentElement:=AddChild('TYUMEN');
         DocumentElement.AddChild('REGISTRATION').AddChild('TIME_START').Text:='Время начала формирования "xml" файла '+DateToStr(Date)+' '+TimeToStr(Time);
      end;
   Ini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'Config.ini');
   FBASIC.IBDatabase1.DatabaseName:=Ini.ReadString('DBASE','File','');
   FBASIC.IBDatabase1.Connected:=true;
   if FBASIC.IBTransaction1.Active=True then FBASIC.IBTransaction1.Rollback;
   FBASIC.IBTransaction1.StartTransaction;
   FBASIC.IBSQL1.SQL.Text:='select IP.num_ip,IP.name_d from IP'
                          +' where IP.result=''НЕ ИСПОЛНЕНО'' and (IP.num_ip containing ''-cд'' or IP.pk_svod is null)';
   FBASIC.IBSQL1.ExecQuery;
   i:=0;
   with XMLDocument.DocumentElement.ChildNodes['REQUISITE'] do
   while not FBASIC.IBSQL1.Eof do
      begin
         i:=i+1;
         ChildNodes['N'+IntToStr(i)].Attributes['num_ip']:=FBASIC.IBSQL1.FieldByName('num_ip').AsString;
         ChildNodes['N'+IntToStr(i)].Attributes['name_d']:=FBASIC.IBSQL1.FieldByName('name_d').AsString;
         FBASIC.IBSQL1.Next;
      end;
   XMLDocument.DocumentElement.ChildNodes['REGISTRATION'].AddChild('TIME_END').Text:='Время окончания формирования "xml" файла '+DateToStr(Date)+' '+TimeToStr(Time);
   XMLDocument.SaveToFile(ExtractFilePath(Paramstr(0))+'Compei.xml');
   XMLDocument.Active:=false;
end;

вот результат
Код HTML:
<?xml version="1.0" encoding="Windows-1251" ?> 
- <TYUMEN>
- <REGISTRATION>
  <TIME_START>Время начала формирования "xml" файла 07.07.2010 8:55:56</TIME_START> 
  <TIME_END>Время окончания формирования "xml" файла 07.07.2010 8:55:59</TIME_END> 
  </REGISTRATION>
- <REQUISITE>
  <N1 num_ip="71/1/75/5/2008" name_d="ТЮМЕНЦЕВ ЕВГЕНИЙ ЮРЬЕВИЧ" /> 
  <N2 num_ip="71/1/82/3/2008" name_d="СКОРОБОГАТОВ АЛЕКСАНДР НИКОЛАЕВИЧ" /> 
  <N3 num_ip="71/1/74/3/2008" name_d="ИЛЮХИНА НАДЕЖДА ФЕДОРОВНА" /> 
т.д.
  </REQUISITE>
  </TYUMEN>
всё работает, только ужасно долго, выгрузка идёт около двух часов.
Так вот хотел вашего совета, может что не так делаю, как оптимизировать?
AndreyF вне форума   Ответить с цитированием
Старый 07.07.2010, 09:31   #2
GSirr
Пользователь
 
Регистрация: 13.05.2009
Сообщений: 42
Репутация: 10
По умолчанию

А сам запрос долго выполняется? Как много записей в запросе? Какую СУБД используешь?
GSirr вне форума   Ответить с цитированием
Старый 07.07.2010, 09:38   #3
igh0st
Форумчанин
 
Аватар для igh0st
 
Регистрация: 05.07.2010
Сообщений: 136
Репутация: 109
По умолчанию

На вскидку - не вижу где добавляется новая нода Nx. Такое ощущение, что сначала XML объект просматриваем всю родительскую ветку на предмет обнаружения ChildNodes['N'+IntToStr(i)] и если не находит не находит, то создает. Попробуй добавить явным образом:
Код:

var
    NewNode: IXMLNode;
begin
    ...
    NewNode := AddChild('N'+IntToStr(i));
    NewNode.Attributes['num_ip'] := FBASIC.IBSQL1.FieldByName('num_ip').AsString;
    NewNode.Attributes['name_d'] := FBASIC.IBSQL1.FieldByName('name_d').AsString;
    ...
end;

igh0st вне форума   Ответить с цитированием
Старый 07.07.2010, 10:56   #4
AndreyF
Пользователь
 
Регистрация: 15.10.2008
Сообщений: 44
Репутация: 10
По умолчанию

да, да, конечно неправильно я делал, но это моя первая выгрузка в xml.
сейчас так прописал, выгрузка 130 000 строк проходит за 10 минут
Код:

with XMLDocument.DocumentElement.AddChild('REQUISITE') do   
   while not FBASIC.IBSQL1.Eof do
      begin
         i:=i+1;
         NiNode:=AddChild('N'+IntToStr(i));
         NiNode.Attributes['num_ip']:=FBASIC.IBSQL1.FieldByName('num_ip').AsString;
         NiNode.Attributes['name_d']:=FBASIC.IBSQL1.FieldByName('name_d').AsString;
         t:=t+1;
         if t=10000 then
            begin
               XMLDocument.SaveToFile(ExtractFilePath(Paramstr(0))+'Compei.xml');
               t:=0;
            end;
         FBASIC.IBSQL1.Next;
      end;

я как понимаю это предел по скорости?
AndreyF вне форума   Ответить с цитированием
Старый 07.07.2010, 11:39   #5
igh0st
Форумчанин
 
Аватар для igh0st
 
Регистрация: 05.07.2010
Сообщений: 136
Репутация: 109
По умолчанию

Не сохраняй файл каждые 10 тысяч итераций, 1 раз в конце вполне достаточно. По скорости - сложно сказать, но скорее всего да - это предел. Впрочем, если хочешь попробовать немного выиграть на движке XML, то вместо штатного TXMLDocument используй TJvSimpleXML из бесплатного набора JVCL.

Последний раз редактировалось igh0st; 07.07.2010 в 12:09.
igh0st вне форума   Ответить с цитированием
Старый 30.07.2010, 14:53   #6
AndreyF
Пользователь
 
Регистрация: 15.10.2008
Сообщений: 44
Репутация: 10
По умолчанию

Всем привет!
Не стал новый топик создавать.
Попытался сам сделать выгрузку данных в xml файл через массив.
Скорости это кстати не прибавило, значит что то намутил неправильно, прошу помочь кто разбирается.
вот моя работа
Код:

var
   XmlDocument: IXMLDocument;
   NiNode: IXMLNode;
   multiArray: array of array of string;
begin
   XmlDocument:=TXMLDocument.Create(nil);
   with XmlDocument do
      begin
         Active:=true;
         Version:='1.0';
         Encoding:='Windows-1251';
         Options:=Options+[doNodeAutoIndent];
         DocumentElement:=AddChild('TYUMEN');//добавить элемент верхнего уровня
         DocumentElement.AddChild('ORGANIZATION').Text:='ПИЦЦА ЭКСПРЕСС';
         DocumentElement.AddChild('PHONE').Text:='656477';
         DocumentElement.AddChild('REGISTRATION').AddChild('TIME_START').Text:='Время начала формирования "xml" файла '+DateToStr(Date)+' '+TimeToStr(Time);
      end;
   Ini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'Config.ini');
   IBDatabase1.DatabaseName:=Ini.ReadString('DBASE','File','');
   IBDatabase1.Connected:=true;
   if IBTransaction1.Active=True then IBTransaction1.Rollback;
   IBTransaction1.StartTransaction;
   IBSQL1.SQL.Text:='select * from M';
   IBSQL1.ExecQuery;
   i:=0;
   t:=0;
   multiArray:=nil;
   SetLength(multiArray,count,2);
   while not IBSQL1.Eof do
      begin
         multiArray[i,0]:=IBSQL1.FieldByName('num_ip').AsString;
         multiArray[i,1]:=IBSQL1.FieldByName('name_d').AsString;
         i:=i+1;
         IBSQL1.Next;
      end;
      with XMLDocument.DocumentElement.ChildNodes['REQUISITE'] do
      for i:=0 to count-1 do
         begin
            NiNode:=AddChild('N'+IntToStr(i));
            NiNode.Attributes['num_ip']:=multiArray[i,0];
            NiNode.Attributes['name_d']:=multiArray[i,1];
         end;
   multiArray:=nil;
   XMLDocument.DocumentElement.ChildNodes['REGISTRATION'].AddChild('TIME_END').Text:='Время окончания формирования "xml" файла '+DateToStr(Date)+' '+TimeToStr(Time);
   XMLDocument.SaveToFile(ExtractFilePath(Paramstr(0))+'unl_'+DateToStr(Date)+'.xml');
   XMLDocument.Active:=false;
   if IBTransaction1.Active=True then IBTransaction1.Rollback;
   if IBDatabase1.Connected=True then IBDatabase1.Connected:=False;
  end;

Можно ли здесь что-нибудь оптимизировать?
AndreyF вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выгрузка в word Сергей846 Microsoft Office Access 3 01.05.2010 22:14
парсер XML, не видит XML тэги supercelt PHP 3 02.11.2009 20:18
Выгрузка из текстовика mephist Microsoft Office Excel 2 06.08.2009 17:25
выгрузка длл user_jasser Win Api 6 10.03.2009 15:09
выгрузка в файл zetrix БД в Delphi 0 30.10.2006 13:50


13:44.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru