Чем прочитать XML

savl

Lotus Team
28.10.2011
2 625
314
BIT
545
Значится так... Траблы возникли, с агентом. Запускаешь один раз, делает ~3000 доков (из 30000) и все.
Сообщения об ошибке нет, не пишет. jvm мертв? Дизайнер работает, но этот агент повторно нет!
Другой java-агент запускается, все ок, значит jvm жива. Ладно поехали дальше.
Запускаю снова: никаких эмоций, ни старта, ни стопа, ни ошибки. Перезапуск клиента.
Запуск агента: ~3000 и все... Все по новой...
recycle делаю, значит что-то еще.
Запустил в тонком клиенте, выдало сообщение:
Exception in thread "AgentThread: JavaAgent" java.lang.OutOfMemoryError
at com.ximpleware.VTDNav.toNormalizedString(VTDNav.java:4469)
из исходников:
C++:
StringBuffer sb = new StringBuffer(len);

вбил в java console "m", выдает: # Память: 16777216 свободно: 14295816 (85%)
16 метров видимо... Расширить никак нельзя?
кстати, в консоль нельзя ничего вбить после падения агента.
вот такая вот пакость... я в java не силен, но Eclipse справляется гораздо лучше...
Есть возможность как-то вместо lotus-jvm подключить sun'овскую?
Я в печали... Уже думаю парсить через LS агент, а отправлять на sftp через java...
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
233
А SAX Parser (только не лотусовский, а родной джавовский) не пробовал?
Вообще SAX когда-то считался самым экономным по памяти, сейчас не знаю.
 

savl

Lotus Team
28.10.2011
2 625
314
BIT
545
Не пробовал пока. Сейчас попробовал просто получать значения из XML, без создания доков. ~2700 документов... Итого меньше...
Короче бред...
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
там, по ссылке - есть LAX (SAX для ленивых :rolleyes: )
суть - в написании методов кастомного класса для перехвата опред событий (т.е. не нужен switch case)
а так - да, VTD хоть и меньше памяти жрет, но жрет...
и gc у нотусёвой ИБМ не сразу освобождает ресурсы (в том числе нотусёвые)
recycle чего делается?

и для настроек памяти и отладки (всякие месюги)
 

savl

Lotus Team
28.10.2011
2 625
314
BIT
545
recycle чего делается?
domino объектов, всех. В конце агента: вьюхи, базы, агента, сессии.
На том месте где ошибка: только документа, по вьюхе ищу дубликаты и обновляю, если нашел.
Назрел вопрос: вьюха и база, глобальные объекты. Влияет?
Кстати, XOM нормально собрал мне xml из 30000 доков, конечный размер ~8 метров.
Если бы он мог прочитать файл изначально, было конечно круто...

UPD: lmike, не помогло.
UPD2: Свою проблему я решил, но достаточно жестко и надо тестировать на серверах, потому что клиент все же не сервер...
Сделал LS агента, который запускает 2 Java-агента.
Первый Java закачивает файл c SFTP, LS затем его парсит и создает документы.
Второй Java формирует xml и отправляет на SFTP.
Хотелось бы услышать критику и какие косяки я словлю... Думаю OutOfMemory все же возможен, но другого решения пока не вижу.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
зачем LS дергает java агенты - непонятно...
а код будет? :rolleyes:

Добавлено: и вдогонку java из бриджа (LS2J) и из агентов - это разные класслоадеры и принципы работы
непонятным остаётся - "кому" не хватает памяти, ведь для VTD все ограничивается одним доком (и тогда *цензура* - сколько доков всего)
ведь выход от фильтрации можно сбрасывать в файл (а не править текущий стрим)
 
K

Kee_Keekkenen

на текущем проекте с сапом приходится разбирать хмл файлы, они небольшие до 1Мб, но их много на начальной загрузке - около 900Мб.. парсинг устроен на регулярных выражениях.. сап разбит на кучу сущностей и в хмл масса лишнего.. в общем, есть сущность, условно говоря это связь между парой каких-то сущностей, при загрузе их около 300 000, которые успешно сохраняются в виде документов.. главная проблема, с которой приходится сталкиваться это лотусовая (классы) часть джавы..

например, есть такая фишка в нашей системе - это когда делается несколько $REF полей от одного документа к нескольким другим, чтобы в видах можно было красиво строить связи от разных родителей.. и проблема возникает при копировании только что созданного поля из одного документа в другой - выдается ошибка, что объект был удален и ресайклед :rolleyes:.. в общем проблема в дииопе, рестартуешь его и вперед по новой..

правда есть еще трабы (пока никак нерешенные), когда код просто вылетает безо всяких ошибок и тут, только курить бамбук.. но это уже к парсингу не относится, а именно при работе с документами.. я пока грешу на методы типа getItemValueString(), getItemValueInteger() и иже сними..
 

savl

Lotus Team
28.10.2011
2 625
314
BIT
545
зачем LS дергает java агенты - непонятно...
Потому что задача должна выполняться, скажем так, последовательно. LS2J я не использую, просто запуск агента.
Через LS я разбираю XML, которые мне получает java агент, по нему через LS создаю доки.
 

savl

Lotus Team
28.10.2011
2 625
314
BIT
545
VladSh
Что вполне логично, LS не сторонняя разработка прикрученная к лотусу, а часть ядра системы в целом(возможно не правильно выразился, я еще сплю). Java же прикручена и обрабатывается jvm, да еще и с ограничениями версии билдов.
На машине стоит JRE 7(1.7), а лотус юзает JRE 6(1.6). :)
И все же java быстрее LS в части задач и возможностей все же больше.
Можно конечно использовать LS2J, но стабильно это работает только при вызове из агентов, если код повесить в hot-spot на форме или в кнопку на вьюхе, то падение будет точно. Что-то с лоадером или контекстом вызова. Видел обсуждение на этом же форуме, но найти не смог.


Ссылка на ответ lmike: link removed.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!