与使用STX(使用Joost)相比,我在哪里可以找到使用XSLT(使用Xalan)的非平凡示例的性能指标(内存/时间)
我有一种情况,我想从一些非常大但常规的XML文件中提取一些信息(只需要使用500 Mb文件),并且XSLT将是完美的.
不幸的是,我所知道的那些XSLT实现(除了最昂贵的Saxon版本之外)不支持只读取DOM的必要部分,而是读取整个树.这导致计算机交换死亡.
有问题的XPath是
//m/e[contains(.,'foobar')
Run Code Online (Sandbox Code Playgroud)
所以它基本上只是一个grep.
是否有可以执行此操作的XSLT实现?或者给出合适的"建议"的XSLT实现可以修复内存中不再需要的部分吗?
我更喜欢Java实现,但Windows和Linux都是可行的本机平台.
编辑:输入XML看起来像:
<log>
<!-- Fri Jun 26 12:09:27 CEST 2009 -->
<e h='12:09:27,284' l='org.apache.catalina.session.ManagerBase' z='1246010967284' t='ContainerBackgroundProcessor[StandardEngine[Catalina]]' v='10000'>
<m>Registering Catalina:type=Manager,path=/axsWHSweb-20090626,host=localhost</m></e>
<e h='12:09:27,284' l='org.apache.catalina.session.ManagerBase' z='1246010967284' t='ContainerBackgroundProcessor[StandardEngine[Catalina]]' v='10000'>
<m>Force random number initialization starting</m></e>
<e h='12:09:27,284' l='org.apache.catalina.session.ManagerBase' z='1246010967284' t='ContainerBackgroundProcessor[StandardEngine[Catalina]]' v='10000'>
<m>Getting message digest component for algorithm MD5</m></e>
<e h='12:09:27,284' l='org.apache.catalina.session.ManagerBase' z='1246010967284' t='ContainerBackgroundProcessor[StandardEngine[Catalina]]' v='10000'>
<m>Completed getting message digest component</m></e>
<e h='12:09:27,284' l='org.apache.catalina.session.ManagerBase' z='1246010967284' t='ContainerBackgroundProcessor[StandardEngine[Catalina]]' v='10000'>
<m>getDigest() 0</m></e>
......
</log>
Run Code Online (Sandbox Code Playgroud)
Essentialy我想选择一些m节点(我知道XPath是错误的,它只是一个快速的黑客),但保持XML布局.
编辑:似乎STX可能是我正在寻找的(我可以使用另一种转换语言),并且Joost是一个实现.有经验吗?
编辑:我发现带有-Xmx1500m的Saxon 6.5.4可以加载我的XML,所以这让我现在可以使用我的XPath.这只是一个幸运的中风所以我仍然想要一般性地解决这个问题 - 这意味着可编写脚本,这反过来意味着首先没有手工制作的Java过滤.
编辑:哦,顺便说一下.这是一个非常类似于log4j XMLLayout生成的日志文件.XML的原因是能够做到这一点,即对日志进行查询.这是最初的尝试,因此是一个简单的问题.后来我希望能够提出更复杂的问题 - …
有没有办法在c ++中的recv()接收的消息中检测STX(文本开头)和ETX(文本结束)字符序列?我正在尝试修复TCP中可能发生的任何部分读取,以便我可以改写完整的消息.
谢谢!
EDIT1:
按照放松的答案做了以下事项:
char c = '\x02';
if(memchr((*it).c_str(), c, numberOfCharactersRead) != NULL)
cout << "STX found" << endl;
Run Code Online (Sandbox Code Playgroud)
我仍然没有设法检测到这个角色.这个实现有什么问题吗?'it'是字符串类型向量的迭代器.
EDIT2:
这是接收数据和检查角色的完整代码:
int numberOfCharactersRead = 0;
do {
char msgBuffer[1000];
memset(msgBuffer, 0, 1000);
numberOfCharactersRead = recv(clientSideSocket, msgBuffer, (1000 - 1), 0);
if (numberOfCharactersRead < 0) {
close(clientSideSocket);
}
else if (numberOfCharactersRead == 0)
close(clientSideSocket);
else {
char c = '\x02';
if(memchr(msgBuffer, c, numberOfCharactersRead) != NULL)
cout << "STX found" << endl;
memset(msgBuffer, 0, 1000);
}
} while (numberOfCharactersRead > …Run Code Online (Sandbox Code Playgroud)