如何在VTD-XML中create/pass大量AutoPilot对象实例?
How to create/pass a lot of AutoPilot object instances in VTD-XML?
在我的组织中,我们使用 xslt 1.0 和 xpath 1.0 来进行大 xml 转换。但是现在我们需要进行迁移。
我正在使用 VTD-XML 来解析和转换一个巨大的 xml 200MB,我有超过 20 个 xpath select,所以我想为它们中的每一个定义:
AutoPilot relationAutoPilot = new AutoPilot();
relationsautoPilot.selectXPath("object[@class='Example']");
AutoPilot first= new AutoPilot();
first.selectXPath("other");
....
public void methodCalulate(final VTDNav partAutoPilot, final AutoPilot partAutoPilot, final AutoPilot first, final AutoPilot second,final AutoPilot third,final AutoPilot fourth) {
navigator.push();
partAutoPilot.bind(navigator);
while ((i = partAutoPilot.evalXPath()) != -1) {
...
method3(navigator,first,second,third,fourth);
..
}
method3(final VTDNav navigator,final AutoPilot first, final AutoPilot second,final AutoPilot third,final AutoPilot fourth) {
navigator.push();
first.bind(navigator);
int i = -1;
while ((i = first.evalXPath()) != -1) {
//Do some buissiness logic
method2(navigator,second,third,fourth);
..
}
}
所以我尝试将它们放在方法层次结构的顶部,而不是 while、for-each 等等,这样可以减少处理器速度和内存,但有一个问题。我想知道如何传递对象,因为:
简单案例
public void methodCalculate(final VTDNav navigator, final AutoPilot partAutoPilot)
OK 一台 AutoPilot ok.
更复杂的情况
methodCalculate 调用方法 3->调用方法 2->调用方法 1
public void methodCalculate(final VTDNav navigator, final AutoPilot partAutoPilot, final AutoPilot first,final AutoPilot second,final AutoPilot third,final AutoPilot fourth){
method3(navigator,first,second,third,fourth);
}
public void method3(final VTDNav navigator,final AutoPilot second,final AutoPilot third,final AutoPilot fourth){
method2(navigator,second,third,fourth);
}
....
并且每个方法都需要 sub select 和相对 xpath 所以我需要传递 4 个 AutoPilots 即使有新的转换规则 other method_0可以来,我需要添加额外的 AutoPilot。
所以我想知道在这种情况下如何进行?如何更有效地传递 AutoObjects,因为它们消耗大量内存并且计算非常昂贵?
我试试看?
我从调用 methodCalulate 的方法中的最顶层提取 AutoPilot,因此它们只创建一次。并在 methodCalulate 中创建其他 AutoPilots。它提高了速度,但在创建 AutoPilots 的下一个内联调用中创建性能地狱。
编辑:
我可以添加带有 AutoPilots 的列表,甚至是地图和常量 class 作为键来搜索给定 select 的正确 AutoPilot。我不知道什么是最好的选择。
AutoPilot 编译应该发生在循环之外...但它不会消耗大量内存...您可以将所有 autoPilot 对象放在一个散列中 table 并使用 xpath 字符串作为散列关键...
您可能已经注意到,vtd-xml 的 xpath 评估是在循环中进行的,这与 DOM 非常不同。虽然这可能有点难以适应......它在实现卓越的性能和低内存使用方面有很多 merits/benefits。
同样对于简单的 xpath,例如涉及一个子标签查找的那些,您可以放弃 xpath,而是将您的应用程序逻辑直接基于光标...适用相同的规则:确保光标位置进入离开该代码块后,一段应用程序逻辑保持不变。
所以你有几个选择:最常见的是 push pop()。但是对于简单的子查找,在调用 toElement(FirstChild) 之后,您所要做的就是调用 toElement(Parent) 到 return 到起始位置。
在我的组织中,我们使用 xslt 1.0 和 xpath 1.0 来进行大 xml 转换。但是现在我们需要进行迁移。
我正在使用 VTD-XML 来解析和转换一个巨大的 xml 200MB,我有超过 20 个 xpath select,所以我想为它们中的每一个定义:
AutoPilot relationAutoPilot = new AutoPilot();
relationsautoPilot.selectXPath("object[@class='Example']");
AutoPilot first= new AutoPilot();
first.selectXPath("other");
....
public void methodCalulate(final VTDNav partAutoPilot, final AutoPilot partAutoPilot, final AutoPilot first, final AutoPilot second,final AutoPilot third,final AutoPilot fourth) {
navigator.push();
partAutoPilot.bind(navigator);
while ((i = partAutoPilot.evalXPath()) != -1) {
...
method3(navigator,first,second,third,fourth);
..
}
method3(final VTDNav navigator,final AutoPilot first, final AutoPilot second,final AutoPilot third,final AutoPilot fourth) {
navigator.push();
first.bind(navigator);
int i = -1;
while ((i = first.evalXPath()) != -1) {
//Do some buissiness logic
method2(navigator,second,third,fourth);
..
}
}
所以我尝试将它们放在方法层次结构的顶部,而不是 while、for-each 等等,这样可以减少处理器速度和内存,但有一个问题。我想知道如何传递对象,因为:
简单案例
public void methodCalculate(final VTDNav navigator, final AutoPilot partAutoPilot)
OK 一台 AutoPilot ok.
更复杂的情况 methodCalculate 调用方法 3->调用方法 2->调用方法 1
public void methodCalculate(final VTDNav navigator, final AutoPilot partAutoPilot, final AutoPilot first,final AutoPilot second,final AutoPilot third,final AutoPilot fourth){ method3(navigator,first,second,third,fourth); } public void method3(final VTDNav navigator,final AutoPilot second,final AutoPilot third,final AutoPilot fourth){ method2(navigator,second,third,fourth); } ....
并且每个方法都需要 sub select 和相对 xpath 所以我需要传递 4 个 AutoPilots 即使有新的转换规则 other method_0可以来,我需要添加额外的 AutoPilot。 所以我想知道在这种情况下如何进行?如何更有效地传递 AutoObjects,因为它们消耗大量内存并且计算非常昂贵?
我试试看? 我从调用 methodCalulate 的方法中的最顶层提取 AutoPilot,因此它们只创建一次。并在 methodCalulate 中创建其他 AutoPilots。它提高了速度,但在创建 AutoPilots 的下一个内联调用中创建性能地狱。
编辑: 我可以添加带有 AutoPilots 的列表,甚至是地图和常量 class 作为键来搜索给定 select 的正确 AutoPilot。我不知道什么是最好的选择。
AutoPilot 编译应该发生在循环之外...但它不会消耗大量内存...您可以将所有 autoPilot 对象放在一个散列中 table 并使用 xpath 字符串作为散列关键...
您可能已经注意到,vtd-xml 的 xpath 评估是在循环中进行的,这与 DOM 非常不同。虽然这可能有点难以适应......它在实现卓越的性能和低内存使用方面有很多 merits/benefits。
同样对于简单的 xpath,例如涉及一个子标签查找的那些,您可以放弃 xpath,而是将您的应用程序逻辑直接基于光标...适用相同的规则:确保光标位置进入离开该代码块后,一段应用程序逻辑保持不变。
所以你有几个选择:最常见的是 push pop()。但是对于简单的子查找,在调用 toElement(FirstChild) 之后,您所要做的就是调用 toElement(Parent) 到 return 到起始位置。