parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

xdoc+xslt+память

KLeN 02.08.2007 22:07 / 02.08.2007 22:13

Возможно кому нибудь пригодится.

Столкнулся с ситуацией нехватки памяти на результирующий xDoc в проекте, достаточно большая лента данных, пагинацию использовать было нельзя. XDoc применялись исключительно XSLT для трансформации на конечном этапе. Очистка переменных и ^memory:compact[] не спасали. Лимит на парсер был жестко ограничен. + Данные должны были расти. FreeBSD, java не установлена.

В итоге применил следующее решение http://www.freebsd.org/cgi/cvsweb.cgi/ports/textproc/sablotron/
админы установили из портов
метод:
####################################################################################################
@parseSablot[s;sTemplate][f;result]
^s.save[/../data/cache/sablot/${status:pid}.xml]
$result[^file::exec[/../exec/sabcmd.sh;;-c $env:DOCUMENT_ROOT/../data/cache/sablot/${status:pid}.xml /dev/stdout ${env:DOCUMENT_ROOT}$sTemplate]]
^if(!$result.status){
	$result[$result.text]
}{
	^throw[Sablot;$result.stderr]
}
#end @parseSablot[s][f;result]
sabcmd.sh - простенький командный файл отдающий все параметры sabcmd

вызывается приблизительно так
^if($hPrint.document.system.sablot){
	$result[^self.parseSablot[$s;$hPrint.document.system.template]]
	}{
	$xDoc[^xdoc::create{$s}]
	$xDoc[^xDoc.transform[$hPrint.document.system.template][$hPrint.document.system]]
	$result[^xDoc.string[]]
}
В варианте с саблотом XDoc не создаются.
Теперь нюансы, xslt переменные переданные хэшем строк из парсера в трансформ в sablot конечно же не попадут, шаблоны должны быть к этому готовы. Файл с энтити подключаю так:
<!DOCTYPE document SYSTEM "$env:DOCUMENT_ROOT/symbols.ent">
довольны и парсер и sablot

Время выполнения увеличивается на 50-60мс видимо изза файловых операций, в памяти выигрываем.

С удовольствием прочитаю альтернативы

PS: да еще саблот не поддерживает exslt:function

  • xdoc+xslt+память, KLeN 02.08.2007 22:07 / 02.08.2007 22:13