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

PS: Идейка вот такая появилась.
При формировании big xml добавлять в них некие служебные nodes, которые как-бы подсказывают ридеру XML, что части xml между
служебными nodes можно парсить параллельно.
Т.е. как-бы логически разбиваем xml на n частей, каждую из которых можно парсить параллельно.
Ну и конечно потом каждое из полученных деревьев линкуем к main three.
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374581
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012... парсинг XML несколькими процессами одновременно?Пардон.
Правильно где-то так:
"... парсинг XML несколькими thread одновременно?"
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374583
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Парсинг XML - это легкая операция. Думаю что скорость вычитвания тегов
будет близка к чтению дискового I/O. Поэтому вряд-ли вы что-то выиграете
нагружая I/O систему. Можете даже проиграть.

Возможно вам параллелить нужно не парсинг XML а процессинг. Тоесть те операции
которые стоят выше парсинга.
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374587
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПарсинг XML - это легкая операция.Имеются свои "заморочки" ...

maytonДумаю что скорость вычитвания тегов
будет близка к чтению дискового I/O.Дисковые операции всегда были на порядки медленнее работы в памяти.
Прочитать за раз 1CB /например если нам нужен DOM/ это один из подходов.
А вот если читаем 100MB и стартуем thread, который парсит эту часть xml, ... - будет наверняка быстрее.
Во-первых не ждем загрузки всего xml.
И что самое главное не один thread парсит xml, а несколько одновременно.
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374589
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вам наверное надо все-таки дать больше инфы о самой задаче т.к. по моему
скромному мнению не существует генерализованного подхода к ршению
вашей специфичной задаче.

Возможно вам подойдет конвейер из 1 процесса XML-парсера, быстрой очереди
типа disruptor, и пула рабочик worker-threads, которые эти задания расхватывают
и делают. Как то так вобщемто.
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374590
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012А вот если читаем 100MB и стартуем thread, который парсит эту часть xml, ... - будет наверняка быстрее.Кстати это суждение не сложно проверить:
Берем любой тестовый файл размером 1GB;
Пишем алгоритм, который читает 100MB и запускает thread, который скажем подсчитываем количество слов, ...
Thread работаем, а мы читаем следующие 100MB и ... /см. строчку выше/.
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374591
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012И что самое главное не один thread парсит xml, а несколько одновременно.

Не выйдет: парсинг любого текстового ML это последовательная операция, не распараллеливается.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374592
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, есть предположение что автор делает свой Hadoop
на XML-ах... но опять-же даже там имеет место partitioning в виде
файлов.
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374593
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВам наверное надо все-таки дать больше инфы о самой задачеДа конкретной задачи пока нет.
Просто этими днями появилась у меня необходимость разработать а-ля MSXML API совместимую library для работы с xml.

Взял за основу TinyXML2.
Дополнил ее классами а-ля MSXML ...
Собственно теперь TinyXML2 как-то неловко и называть TinyXML2 ... /выкладывать на github пока не буду/.

Так вот load() в TinyXML2 читает за раз весь XML.
Вот и пришла мысль, что для небольших xml такой подход сойдет, а вот для big xml скорее всего нет.
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374594
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012 /выкладывать на github пока не буду/.

На этой печальной ноте наверное можно закрывать топик.

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

Что бы не было вам печально подскажу где взять исходные тексты а-ля MSXML library.
В исходниках ReactOS имеется полноценные исходные тексты а-ля MSXML library /мне они не подошли/.

Что касается моего велосипеда, то кому он нужен?
Можно к примеру просто использовать готовое API Microsoft /и ни каких проблем/.
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374597
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прочитать целиком в память будет быстрее. там кто-то тестировал на хабре, spirit + целиком в память побило все рекорды.
дисковые операции медленные еще и потому, что им нужно головку позиционировать. когда прочитаешь 100мб, потом какой-то другой файл прочитается (другим процессом), потом еще 100 - головку опять позиционировать... короче быстрее за раз его прочитать.
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374601
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мир сошел с ума.

Если вы спецом пишете ПО под сервер где можете кидаться гигами
направо и налево - то наверное надо сообщить об этом в первых
строках сообщения. А так вообще ... оператива всегда будет стоить
дороже чем диск. И этот инженерно-экономический подход будет доминировать
всегда.
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374602
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexy_blackдисковые операции медленные еще и потому, что им нужно головку позиционировать. когда прочитаешь 100мб, потом какой-то другой файл прочитается (другим процессом), потом еще 100 - головку опять позиционировать... короче быстрее за раз его прочитать.Гм.
Да ведь речь идет не об нескольких процессах, а об одном.
Читаем 100Mb запускаем thread, продолжаем читать ...
Ну хорошо скажем так.
Читаем за одну операцию чтения весь 1GB и затем разбиваем 1GB на 10 частей, каждая из которых парсится отдельным thread.
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374604
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012Читаем 100Mb запускаем thread, продолжаем читать ...

После блока в 32к скорость чтения уже не повышается, так что зря тратить мегабайты не
имеет смысла.

Владимир2012затем разбиваем 1GB на 10 частей
Проблема в том, что текстовый файл не разбивается. Нет к нему рандомного доступа, только
последовательный.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374606
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЕсли вы спецом пишете ПО под сервер где можете кидаться гигами
направо и налево - то наверное надо сообщить об этом в первых
строках сообщенияДа нет же.
Еще раз говорю.
Тема топика навеяна всего лишь обсуждением абстрактной задачи ...

Хотя впрочем если считаете, что это надуманная задача, которую нет смысла обсуждать, то возражать не буду.
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374607
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovПроблема в том, что текстовый файл не разбивается. Нет к нему рандомного доступа, только
последовательный.Дмитрий.
Обратите внимание на то, что в начале топика мною было преложено дополнять xml некоими служебными nodes,
назначение которых состоит в том, что при считывании xml нам известны "логически правильные" части
xml, которые можем парсить в отдельных thread.
Sorry повторюсь.
Так вот эти служебные nodes как раз и решают ту задачу об которой вы говорите "... текстовый файл не разбивается. Нет к нему рандомного доступа, только
последовательный.".
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374609
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012если считаете, что это надуманная задача, которую нет смысла обсуждать, то возражать не буду.

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

Вот смотри: у меня есть софтина, читающая и парсящая определённый файл. Она это делает на
скорости примерно 10 Мб в секунду. При том, что просто чтение этого файла с диска идёт на
скорости 100 Мб в секунду. Отсюда вытекает, что если я в этой софтине наворочу
многопоточность, очереди, совмещу чтение и обработку и таким образом доведу расходы
времени на собственно чтение до нуля, то получу общее ускорение в 10% максимум. Оно того
не стоит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374611
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovОтсюда вытекает, что если я в этой софтине наворочу
многопоточность, очереди, совмещу чтение и обработку и таким образом доведу расходы
времени на собственно чтение до нуля, то получу общее ускорение в 10% максимум. Оно того
не стоит.Вообщем то да.
Но заметьте парсинг идет с скростью 10MB в секунду, значит сколько времени понадобится для парсинга 100MB - 10 секунд.
А вот если ядрышки вашего процессора загрузить "по полной", а их у вас скажем будет 10,
То сколько времени понадобится для парсинга 100MB?
Не 10 секунд, а всего лишь 1 секунда.
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374612
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012эти служебные nodes как раз и решают ту задачу об которой вы говорите

Не решают, поскольку для их нахождения файл надо распарсить.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374614
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНе решают, поскольку для их нахождения файл надо распарсить.Да зачем его парсить?
Когда создается big xml программист знает в какие места xml нужно добавить служебные nodes.
Далее все просто.
За одну и операцию чтения читаем 1GB и далее находим в memory обычным циклом находим эти служебные
nodes.
И все!
После этого запускаем n thread каждый из которых знает какую часть xml он должен парсить.

Sorry. Еще раз.
Служебные nodes избавляют нас от необходимости парсинга всего xml ...
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374616
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012То сколько времени понадобится для парсинга 100MB?

Ровно столько же, поскольку формат этого файла такой же последовательный, как и XML. Чтобы
найти начало блока N, нужно предварительно обработать блок N-1. А если в него ввести
метаструктуры (те самые "служебные ноды" о которых ты толкуешь), то это будет уже совсем
другой формат.

В твоём случае, для распараллеливания обработки, куски XML придётся обернуть в XDR, отчего
файл в целом уже перестанет быть XML-ем. Так, может, сразу не мучиться и вместо XML
использовать XDR, который и сам по себе парсится легче, да ещё и распараллеливается при
желании?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374619
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012, так что ли?

vladimir-s.xml
Код: xml
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>
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374621
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovВ твоём случае, для распараллеливания обработки, куски XML придётся обернуть в XDR, отчего
файл в целом уже перестанет быть XML-ем. Так, может, сразу не мучиться и вместо XML
использовать XDR, который и сам по себе парсится легче, да ещё и распараллеливается при
желании?..У меня "конкретной" задачи пока нет /обсужденение абстрактной задачи/.
Да безусловно имеются некоторые текстовые файлы, которые нельзя "разбить" на логические части так,
чтобы можно все эти части парсить параллельно.
А вот к примеру /экспромтом/ берем xml файл в котором находятся паспортные данные 10 000 000 человек и все
nodes однотипные.
В этом случае ИМХНО вполне можно разбить этот big xml на n частей, каждую из которых будет парсить отдельный thread.

PS: В целом конечно с вами согласен. Имеются "не разбиваемые" текстовые файлы /например текст огромной программы/ ...
Но имеются и не мало big текстов, которые пригодны для параллельной обработки.
...
Рейтинг: 0 / 0
Как распараллелить загрузку XML?
    #39374622
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВладимир2012, так что ли?Да ... /и вариации на тему/.
...
Рейтинг: 0 / 0
25 сообщений из 122, страница 1 из 5
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как распараллелить загрузку XML?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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