powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / MSXML Создание больших файлов
6 сообщений из 6, страница 1 из 1
MSXML Создание больших файлов
    #39516704
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создается файл подобного формата
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
<root>
  <table1>
    <table1_row>
      <field11>Value11</field11>
      <field12>Value12</field12>
      ............
      <field1n>Value1n</field1n>
    </table1_row>
    <table1_row>
      ...........
    </table1_row>
    ............
  </table1>
  <table2>
    .......
  </table2>
  ..........
  <tableN>
    .......
  </tableN>
</root>


Процедура добавления новой строки таблицы
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure TXMLDataSet.Post;
var
  LNewNode: IXMLDOMNode;
  Li: Integer;
  LError: IXMLDOMParseError;
begin
  LNewNode := FXMLDoc.createNode(NODE_ELEMENT, FRowElementName, Namespace);
  for Li := 0 to Fields.Count - 1 do
    FFields[Li].Post(LNewNode);
  FParentNode.appendChild(LNewNode);
  LError := FXMLDoc.validateNode(LNewNode);
  Win32Check(LError.errorCode);
end;


Проблема: время работы этой процедуры сильно зависит от того сколько уже узлов вставлено в FParentNode. При 15000 строк время работы составляет 15 мс на один запуск (начинается с 0). Т.к. идет параллельная вставка в три таблицы, то суммарное время работы оказывается весьма значительным. Первые 30% всей работы выполняются где-то минут за 30, а остальные 70% - часа за 4.

Собственно вопрос - чего бы такого подкрутить? Цикл вставки полей
Код: pascal
1.
2.
  for Li := 0 to Fields.Count - 1 do
    FFields[Li].Post(LNewNode);

всегда выполняется за константное время (~0), а время выполнения appendChild и validateNode растет линейно, в зависимости от количества записей.

Если код слегка модифицировать
Код: pascal
1.
2.
3.
4.
5.
  LNewNode := FXMLDoc.createNode(NODE_ELEMENT, FRowElementName, Namespace);
  FParentNode.appendChild(LNewNode);
  for Li := 0 to Fields.Count - 1 do
    FFields[Li].Post(LNewNode);
  LError := FXMLDoc.validateNode(LNewNode);

то получаем почти незаметный рост времени валидации (от 0 то 2 мс на 17000 записей). Чуть больший на appendChild (от 0 до 5) и дикий рост на добавления полей (до 15 мс на 17000 записей). В итоге такой код работает на 5-7 мс дольше, чем исходный.

Пробовал играться с фрагментами (IXMLDOMDocumentFragment) и вставлять в 1 фрагмент по 1000 записей, но тогда отваливалась валидация. Если же запись вставлять вначале в ноду, там валидировать, а потом переносить в фрагмент, то получалась существенная просадка по скорости.

В общем, приветствуются любые идеи (вплоть до смены парсера). Но новый парсер должен будет уметь валидировать по XSD схеме. В том числе, поддерживать валидацию одного узла

В приложении время выполнения базового варианта

С уважением, Vasilisk
...
Рейтинг: 0 / 0
MSXML Создание больших файлов
    #39516707
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот как выглядит модифицированный вариант
...
Рейтинг: 0 / 0
MSXML Создание больших файлов
    #39516745
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использование фрагментов по 1000 узлов. Валидация отключена, фрагменты вставляются в документ сразу после создания. На графике append строки в фрагмент. Кто мне объяснит природу этих ступеней? Как раз на 1000 записей
...
Рейтинг: 0 / 0
MSXML Создание больших файлов
    #39516873
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы попробовал для каждой из таблиц формировать свой XML-документ, после окончания заполнения всех таблиц объединить их в один документ. При этом, если вставка идет параллельно в три таблицы одновременно - попробовал бы разнести эту операцию по трем различным потокам с ожиданием завершения всех трех в главном потоке.
...
Рейтинг: 0 / 0
MSXML Создание больших файлов
    #39517417
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловныпосле окончания заполнения всех таблиц объединить их в один документБыла такая мысль. Но не займет ли процесс объединения ровно то же время, что и изначальная вставка?
Сон Веры Павловныпопробовал бы разнести эту операцию по трем различным потокамТам не то, чтобы параллельно. Там мастер-детайл-детайл. Хотя да - попробовать можно
...
Рейтинг: 0 / 0
MSXML Создание больших файлов
    #39517547
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Кто мне объяснит природу этих ступеней?Изменил дискретизацию таймера с 1мс до 0.1мс и ступеньки пропали стабильный рост
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / MSXML Создание больших файлов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]