powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как распараллелить загрузку XML?
25 сообщений из 122, страница 3 из 5
Как распараллелить загрузку XML?
    #39374738
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovВладимир2012если считаете, что это надуманная задача, которую нет смысла обсуждать, то возражать не буду.

Задача не надуманная, но её решение не принесёт счастья.

Вот смотри: у меня есть софтина, читающая и парсящая определённый файл. Она это делает на
скорости примерно 10 Мб в секунду. При том, что просто чтение этого файла с диска идёт на
скорости 100 Мб в секунду. Отсюда вытекает, что если я в этой софтине наворочу
многопоточность, очереди, совмещу чтение и обработку и таким образом доведу расходы
времени на собственно чтение до нуля, то получу общее ускорение в 10% максимум. Оно того
не стоит.

Про 10% не понял. В идеале ускорение в 10 раз.
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374741
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПро 10% не понял. В идеале ускорение в 10 раз.
Нарисуй временную диаграмму работы. Программа секунду читает, девять секунд парсит. Если
засунуть чтение "под" парсинг, 9 секунд никуда не денутся, в конце ты получишь 9 секунд
работы вместо 10. 10%.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374745
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TДопустим прочитали мы ровно 100 Мб и на конце получили обрубок чего-то. Вторые 100 Мб начинаются вообще непонятно с какого места, т.к. это мы узнаем только по окончании разбора первых 100 Мб, как начинать работать второму потоку?Sorry.
Придется повториться.
Владимир2012 Эврика!

В начале xml помещаем node, содержащий данные об "логических" частях xml.
И не надо тратить время на поиск этих частей и не нужны ни какие вспомогательные nodes.Разбивку на "логические" части xml можно возложить на library, обеспечивающей работу с xml или как вариант
предоставить программисту саму на его усмотрение добавить в xml некоторые маркеры.

То что предлагаю является всего лишь некоторым вариантом решения данного вопроса и ни коим образом не претендует на априори правильный подход.
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374748
Фотография Хнык
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно, что сохраняя данные не в хмл, а в собственном формате, можно снизить размер от десяти процентов, до порядка, в зависимости от данных. Что, соответственно, может дать ускорение последующего считывания.
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374752
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovDima TПро 10% не понял. В идеале ускорение в 10 раз.
Нарисуй временную диаграмму работы. Программа секунду читает, девять секунд парсит. Если
засунуть чтение "под" парсинг, 9 секунд никуда не денутся, в конце ты получишь 9 секунд
работы вместо 10. 10%.

Если парсить в 9 потоков, то распарсит за секунду. Другой вопрос разрешает ли алгоритм парсить в 9 потоков?
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374754
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПопробуй. Там есть бинарное представление XML. И индексирование. Может
в твоей задаче это будет коробочным решением.Ok!
Одна только сложность - тьма текущей работы.
Надеюсь к Рождеству Христову справлюсь с xml, а далее нужно закончить начатый проект - import Firebird баз в 1С, обеспечивающий
как создание мета данных в конфигураторе (для таблиц, диалоговых форм, ... много чего) так и загрузку данных, ...
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374756
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TДругой вопрос разрешает ли алгоритм парсить в 9 потоков?

Как я уже сказал: не разрешает. Парсером работает автомат с состоянием и обработка блока N
зависит от блока N-1. И даже если бы автомат был без состояния, блоки не имеют
фиксированной длины и тупо найти начало следующего невозможно не распарсив предыдущий. О
чём тут тоже уже говорилось.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374758
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА по поводу моего варианта - его за 1-й проход следует разбить на куски и сохранить их:

Код: plaintext
1.
2.
3.
vladimir-s.chunk-01.xml
vladimir-s.chunk-02.xml
....


Сам процесс резания - прекрасно совмещается со скачиванием (потоковые операции).

Орининал - грохнуть.
+1
ИМХУ просто и работать должно быстро при достаточном наличии памяти, т.к. в кэше ОС останется скорее всего.
Парсить можно начинать сразу после создания chunk-01.xml причем без всяких самодельных парсеров.
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374759
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012Library для работы с xml мне нужна в основном для интеграции binary three с xml.
всё в порядке - импорт экспорт XML/JSON, внутри своё
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374767
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovDima TДругой вопрос разрешает ли алгоритм парсить в 9 потоков?

Как я уже сказал: не разрешает. Парсером работает автомат с состоянием и обработка блока N
зависит от блока N-1. И даже если бы автомат был без состояния, блоки не имеют
фиксированной длины и тупо найти начало следующего невозможно не распарсив предыдущий. О
чём тут тоже уже говорилось.

Это если тупо рубить по К байт, но если выделять логические блоки, независимые друг-от-друга, то можно.
Выделить блоки несложно, например явно задав разделитель, как выше предлагалось. Или перед разбором задавать какие-то правила что считать блоком, как я предлагал 20046249
напримерИмеем файл
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<?xml version='1.0'?>
<list>
  <!-- Chunk #1 -->
  <row>.....</row>
  <row>.....</row>
   ......
  <!-- Chunk #2 --> 
  <row>.....</row>
  <row>.....</row>
   ....
</list>


сохранить как
Chunk#1.xml
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
<?xml version='1.0'?>
<list>
  <!-- Chunk #1 -->
  <row>.....</row>
  <row>.....</row>
   ......
</list>


Chunk#2.xml
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
<?xml version='1.0'?>
<list>
  <!-- Chunk #2 -->
  <row>.....</row>
  <row>.....</row>
   ......
</list>


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

Тут может возникнуть необходимость сохранения порядка, но ее можно обойти например промежуточным кэшированием результатов каждого разбора и последующим сохранением в нужном порядке
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374771
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВыделить блоки несложно, например явно задав разделитель, как выше предлагалось.

И тут мы получаем необходимость seek() и потерю потоковости или накопление блоков в
огромных буферах памяти, что, конечно, тоже вариант, но не из простых.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374779
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovDima TВыделить блоки несложно, например явно задав разделитель, как выше предлагалось.

И тут мы получаем необходимость seek() и потерю потоковости или накопление блоков в
огромных буферах памяти, что, конечно, тоже вариант, но не из простых.

Зачем? Исходный файл парсить не XML-парсерами, а просто как файл, самодельным парсером, блоками по 32 К (одного буфера достаточно): прочитали, разобрали как текст, сбросили буфер в конечный файл. Если наткнулись на разделитель - сбросили до разделителя, закрыли, начали новый файл и т.д.

Такой парсер однопроходный и тормозить особо не будет. Все что ему надо делать - получать текущее местоположение в XML, например "list/row". Чтобы на его основе сгенерить конец закрываемого файла и начало следующего.

Описал упрощенно, но никаких seek() точно не потребуется, выравнивая в буфере будет достаточно.
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374780
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tпрочитали, разобрали как текст
Армянский комсомол не ищет лёгких путей, а сначала создаёт трудности и только потом мужественно их преодолевает.
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374783
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все же как вариант предлагаю:

- Разбивку на "логические" части xml можно возложить на library, обеспечивающей работу с xml или как вариант
предоставить программисту саму на его усмотрение добавить в xml некоторые маркеры.

- при отработке save() library на основании маркеров /спец узлов, .../ создает и добавляет в xml node,
который будет следовать сразу за root node данные об начале и окончании каждого логического блока

В этом случае при загрузке xml нам сразу известно место нахождение каждого логического блока и тем
самым сразу запускаем n парсеров, каждый из которых знает данные об месте нахождения логического блока.

Sorry.
Тем самым при загрузке xml у нас отпадает необходимость в нахождении этих логических блоков.
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374791
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012или как вариант предоставить программисту саму на его усмотрение добавить в xml некоторые маркеры.
ИМХУ Если мы имеем возможность править XML на выходе у создателя, то можно сразу генерить отдельные файлы с завершенной структурой и не заниматься излишним разбором на получателе. Так проще всего.

Вобщем я к тому что не надо закладываться на какие-либо разделители. Надо исходить из того что их нет.
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374792
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012,

SAX парсер напускал на свои данные?
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374793
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
печаль в том, что при редактировании документа маркеры могут сохраниться и указывать в случайные места
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374795
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TИМХУ Если мы имеем возможность править XML на выходе у создателя, то можно сразу генерить отдельные файлы с завершенной структурой и не заниматься излишним разбором на получателе. Так проще всего.То бишь будет какой-то main xml, содержащий /к примеру/ include-s с данными об подчиненных xml?
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374797
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилSAX парсер напускал на свои данные?Нет.
Пока в использовании его не было необходимости /использую "со слезами на глазах" DOM/.
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374798
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012ИзопропилSAX парсер напускал на свои данные?Нет.
Пока в использовании его не было необходимости /использую "со слезами на глазах" DOM/.

Странно как-то - отсутствие необходимости в парсере, ориентированном на большие объёмы.

А городить уродца - необходимость есть
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374800
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилпечаль в том, что при редактировании документа маркеры могут сохраниться и указывать в случайные местаЕсли это комментарий кВладимир2012- при отработке save() library на основании маркеров /спец узлов, .../ создает и добавляет в xml node,
который будет следовать сразу за root node данные об начале и окончании каждого логического блокато не беда место данные об месте нахождении логического блока не попадают сразу на маркер блока, ищем ближайший слева или справа.

А лучше всего "бить линейкой по рукам" тех кто много умничает и "вручную" редактирует xml, содержащий данные об логических блоках.

Ну а если серьезно, то ваше замечание интересное и возникает вопрос как эту проблему ...
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374801
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012Dima TИМХУ Если мы имеем возможность править XML на выходе у создателя, то можно сразу генерить отдельные файлы с завершенной структурой и не заниматься излишним разбором на получателе. Так проще всего.То бишь будет какой-то main xml, содержащий /к примеру/ include-s с данными об подчиненных xml?
Можно так. По большому счету там надо знать какой файл на каком месте и сколько их всего.
Можно просто в имя файла дописать который из скольки.
Код: plaintext
1.
2.
3.
MyData_01of20.xml
MyData_02of20.xml
...
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374802
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилСтранно как-то - отсутствие необходимости в парсере, ориентированном на большие объёмы.Еще не припекло.ИзопропилА городить уродца - необходимость естьА это про что?
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374803
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012ИзопропилА городить уродца - необходимость естьА это про что?
про дополнительные процессинг-инструкции в XML для обеспечения параллельного парсинга.

Владимир2012Еще не припекло.
ну а к чему упражнения с параллельным парсингом тогда?
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374804
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TМожно так. По большому счету там надо знать какой файл на каком месте и сколько их всего.Пожалуй такой подход решает проблему в необходимости наличия маркеров и "ручное" редактирование нам не помеха.
Предлагаю это main xml и подчиненные xml хранить в zip файле.
...
Рейтинг: 0 / 0
25 сообщений из 122, страница 3 из 5
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как распараллелить загрузку XML?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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