Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как распараллелить загрузку XML?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovВладимир2012если считаете, что это надуманная задача, которую нет смысла обсуждать, то возражать не буду. Задача не надуманная, но её решение не принесёт счастья. Вот смотри: у меня есть софтина, читающая и парсящая определённый файл. Она это делает на скорости примерно 10 Мб в секунду. При том, что просто чтение этого файла с диска идёт на скорости 100 Мб в секунду. Отсюда вытекает, что если я в этой софтине наворочу многопоточность, очереди, совмещу чтение и обработку и таким образом доведу расходы времени на собственно чтение до нуля, то получу общее ускорение в 10% максимум. Оно того не стоит. Про 10% не понял. В идеале ускорение в 10 раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 14:11 |
|
||
|
Как распараллелить загрузку XML?
|
|||
|---|---|---|---|
|
#18+
Dima TПро 10% не понял. В идеале ускорение в 10 раз. Нарисуй временную диаграмму работы. Программа секунду читает, девять секунд парсит. Если засунуть чтение "под" парсинг, 9 секунд никуда не денутся, в конце ты получишь 9 секунд работы вместо 10. 10%. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 14:17 |
|
||
|
Как распараллелить загрузку XML?
|
|||
|---|---|---|---|
|
#18+
Dima TДопустим прочитали мы ровно 100 Мб и на конце получили обрубок чего-то. Вторые 100 Мб начинаются вообще непонятно с какого места, т.к. это мы узнаем только по окончании разбора первых 100 Мб, как начинать работать второму потоку?Sorry. Придется повториться. Владимир2012 Эврика! В начале xml помещаем node, содержащий данные об "логических" частях xml. И не надо тратить время на поиск этих частей и не нужны ни какие вспомогательные nodes.Разбивку на "логические" части xml можно возложить на library, обеспечивающей работу с xml или как вариант предоставить программисту саму на его усмотрение добавить в xml некоторые маркеры. То что предлагаю является всего лишь некоторым вариантом решения данного вопроса и ни коим образом не претендует на априори правильный подход. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 14:18 |
|
||
|
Как распараллелить загрузку XML?
|
|||
|---|---|---|---|
|
#18+
Возможно, что сохраняя данные не в хмл, а в собственном формате, можно снизить размер от десяти процентов, до порядка, в зависимости от данных. Что, соответственно, может дать ускорение последующего считывания. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 14:23 |
|
||
|
Как распараллелить загрузку XML?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovDima TПро 10% не понял. В идеале ускорение в 10 раз. Нарисуй временную диаграмму работы. Программа секунду читает, девять секунд парсит. Если засунуть чтение "под" парсинг, 9 секунд никуда не денутся, в конце ты получишь 9 секунд работы вместо 10. 10%. Если парсить в 9 потоков, то распарсит за секунду. Другой вопрос разрешает ли алгоритм парсить в 9 потоков? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 14:29 |
|
||
|
Как распараллелить загрузку XML?
|
|||
|---|---|---|---|
|
#18+
maytonПопробуй. Там есть бинарное представление XML. И индексирование. Может в твоей задаче это будет коробочным решением.Ok! Одна только сложность - тьма текущей работы. Надеюсь к Рождеству Христову справлюсь с xml, а далее нужно закончить начатый проект - import Firebird баз в 1С, обеспечивающий как создание мета данных в конфигураторе (для таблиц, диалоговых форм, ... много чего) так и загрузку данных, ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 14:30 |
|
||
|
Как распараллелить загрузку XML?
|
|||
|---|---|---|---|
|
#18+
Dima TДругой вопрос разрешает ли алгоритм парсить в 9 потоков? Как я уже сказал: не разрешает. Парсером работает автомат с состоянием и обработка блока N зависит от блока N-1. И даже если бы автомат был без состояния, блоки не имеют фиксированной длины и тупо найти начало следующего невозможно не распарсив предыдущий. О чём тут тоже уже говорилось. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 14:36 |
|
||
|
Как распараллелить загрузку XML?
|
|||
|---|---|---|---|
|
#18+
maytonА по поводу моего варианта - его за 1-й проход следует разбить на куски и сохранить их: Код: plaintext 1. 2. 3. Сам процесс резания - прекрасно совмещается со скачиванием (потоковые операции). Орининал - грохнуть. +1 ИМХУ просто и работать должно быстро при достаточном наличии памяти, т.к. в кэше ОС останется скорее всего. Парсить можно начинать сразу после создания chunk-01.xml причем без всяких самодельных парсеров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 14:40 |
|
||
|
Как распараллелить загрузку XML?
|
|||
|---|---|---|---|
|
#18+
Владимир2012Library для работы с xml мне нужна в основном для интеграции binary three с xml. всё в порядке - импорт экспорт XML/JSON, внутри своё ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 14:41 |
|
||
|
Как распараллелить загрузку XML?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovDima TДругой вопрос разрешает ли алгоритм парсить в 9 потоков? Как я уже сказал: не разрешает. Парсером работает автомат с состоянием и обработка блока N зависит от блока N-1. И даже если бы автомат был без состояния, блоки не имеют фиксированной длины и тупо найти начало следующего невозможно не распарсив предыдущий. О чём тут тоже уже говорилось. Это если тупо рубить по К байт, но если выделять логические блоки, независимые друг-от-друга, то можно. Выделить блоки несложно, например явно задав разделитель, как выше предлагалось. Или перед разбором задавать какие-то правила что считать блоком, как я предлагал 20046249 напримерИмеем файл Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. сохранить как Chunk#1.xml Код: plaintext 1. 2. 3. 4. 5. 6. 7. Chunk#2.xml Код: plaintext 1. 2. 3. 4. 5. 6. 7. дальше парсим каждый независимо от других. В итоге имеем общее время разбора = время чтения + время разбора последнего блока. Тут может возникнуть необходимость сохранения порядка, но ее можно обойти например промежуточным кэшированием результатов каждого разбора и последующим сохранением в нужном порядке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 14:56 |
|
||
|
Как распараллелить загрузку XML?
|
|||
|---|---|---|---|
|
#18+
Dima TВыделить блоки несложно, например явно задав разделитель, как выше предлагалось. И тут мы получаем необходимость seek() и потерю потоковости или накопление блоков в огромных буферах памяти, что, конечно, тоже вариант, но не из простых. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 15:05 |
|
||
|
Как распараллелить загрузку XML?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovDima TВыделить блоки несложно, например явно задав разделитель, как выше предлагалось. И тут мы получаем необходимость seek() и потерю потоковости или накопление блоков в огромных буферах памяти, что, конечно, тоже вариант, но не из простых. Зачем? Исходный файл парсить не XML-парсерами, а просто как файл, самодельным парсером, блоками по 32 К (одного буфера достаточно): прочитали, разобрали как текст, сбросили буфер в конечный файл. Если наткнулись на разделитель - сбросили до разделителя, закрыли, начали новый файл и т.д. Такой парсер однопроходный и тормозить особо не будет. Все что ему надо делать - получать текущее местоположение в XML, например "list/row". Чтобы на его основе сгенерить конец закрываемого файла и начало следующего. Описал упрощенно, но никаких seek() точно не потребуется, выравнивая в буфере будет достаточно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 15:29 |
|
||
|
Как распараллелить загрузку XML?
|
|||
|---|---|---|---|
|
#18+
Dima Tпрочитали, разобрали как текст Армянский комсомол не ищет лёгких путей, а сначала создаёт трудности и только потом мужественно их преодолевает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 15:34 |
|
||
|
Как распараллелить загрузку XML?
|
|||
|---|---|---|---|
|
#18+
Все же как вариант предлагаю: - Разбивку на "логические" части xml можно возложить на library, обеспечивающей работу с xml или как вариант предоставить программисту саму на его усмотрение добавить в xml некоторые маркеры. - при отработке save() library на основании маркеров /спец узлов, .../ создает и добавляет в xml node, который будет следовать сразу за root node данные об начале и окончании каждого логического блока В этом случае при загрузке xml нам сразу известно место нахождение каждого логического блока и тем самым сразу запускаем n парсеров, каждый из которых знает данные об месте нахождения логического блока. Sorry. Тем самым при загрузке xml у нас отпадает необходимость в нахождении этих логических блоков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 15:42 |
|
||
|
Как распараллелить загрузку XML?
|
|||
|---|---|---|---|
|
#18+
Владимир2012или как вариант предоставить программисту саму на его усмотрение добавить в xml некоторые маркеры. ИМХУ Если мы имеем возможность править XML на выходе у создателя, то можно сразу генерить отдельные файлы с завершенной структурой и не заниматься излишним разбором на получателе. Так проще всего. Вобщем я к тому что не надо закладываться на какие-либо разделители. Надо исходить из того что их нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 15:58 |
|
||
|
Как распараллелить загрузку XML?
|
|||
|---|---|---|---|
|
#18+
Владимир2012, SAX парсер напускал на свои данные? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 15:59 |
|
||
|
Как распараллелить загрузку XML?
|
|||
|---|---|---|---|
|
#18+
печаль в том, что при редактировании документа маркеры могут сохраниться и указывать в случайные места ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 16:02 |
|
||
|
Как распараллелить загрузку XML?
|
|||
|---|---|---|---|
|
#18+
Dima TИМХУ Если мы имеем возможность править XML на выходе у создателя, то можно сразу генерить отдельные файлы с завершенной структурой и не заниматься излишним разбором на получателе. Так проще всего.То бишь будет какой-то main xml, содержащий /к примеру/ include-s с данными об подчиненных xml? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 16:03 |
|
||
|
Как распараллелить загрузку XML?
|
|||
|---|---|---|---|
|
#18+
ИзопропилSAX парсер напускал на свои данные?Нет. Пока в использовании его не было необходимости /использую "со слезами на глазах" DOM/. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 16:07 |
|
||
|
Как распараллелить загрузку XML?
|
|||
|---|---|---|---|
|
#18+
Владимир2012ИзопропилSAX парсер напускал на свои данные?Нет. Пока в использовании его не было необходимости /использую "со слезами на глазах" DOM/. Странно как-то - отсутствие необходимости в парсере, ориентированном на большие объёмы. А городить уродца - необходимость есть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 16:13 |
|
||
|
Как распараллелить загрузку XML?
|
|||
|---|---|---|---|
|
#18+
Изопропилпечаль в том, что при редактировании документа маркеры могут сохраниться и указывать в случайные местаЕсли это комментарий кВладимир2012- при отработке save() library на основании маркеров /спец узлов, .../ создает и добавляет в xml node, который будет следовать сразу за root node данные об начале и окончании каждого логического блокато не беда место данные об месте нахождении логического блока не попадают сразу на маркер блока, ищем ближайший слева или справа. А лучше всего "бить линейкой по рукам" тех кто много умничает и "вручную" редактирует xml, содержащий данные об логических блоках. Ну а если серьезно, то ваше замечание интересное и возникает вопрос как эту проблему ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 16:19 |
|
||
|
Как распараллелить загрузку XML?
|
|||
|---|---|---|---|
|
#18+
Владимир2012Dima TИМХУ Если мы имеем возможность править XML на выходе у создателя, то можно сразу генерить отдельные файлы с завершенной структурой и не заниматься излишним разбором на получателе. Так проще всего.То бишь будет какой-то main xml, содержащий /к примеру/ include-s с данными об подчиненных xml? Можно так. По большому счету там надо знать какой файл на каком месте и сколько их всего. Можно просто в имя файла дописать который из скольки. Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 16:20 |
|
||
|
Как распараллелить загрузку XML?
|
|||
|---|---|---|---|
|
#18+
ИзопропилСтранно как-то - отсутствие необходимости в парсере, ориентированном на большие объёмы.Еще не припекло.ИзопропилА городить уродца - необходимость естьА это про что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 16:22 |
|
||
|
Как распараллелить загрузку XML?
|
|||
|---|---|---|---|
|
#18+
Владимир2012ИзопропилА городить уродца - необходимость естьА это про что? про дополнительные процессинг-инструкции в XML для обеспечения параллельного парсинга. Владимир2012Еще не припекло. ну а к чему упражнения с параллельным парсингом тогда? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 16:26 |
|
||
|
Как распараллелить загрузку XML?
|
|||
|---|---|---|---|
|
#18+
Dima TМожно так. По большому счету там надо знать какой файл на каком месте и сколько их всего.Пожалуй такой подход решает проблему в необходимости наличия маркеров и "ручное" редактирование нам не помеха. Предлагаю это main xml и подчиненные xml хранить в zip файле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 16:26 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39374767&tid=2018337]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
65ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
| others: | 293ms |
| total: | 466ms |

| 0 / 0 |
