我有很多xml文件。每个xml文件都包含太多的行和标记。在这里,我必须解析它们并使用xml的文件名编写.txt文件。这需要尽快完成。越快越好。
xml文件示例:
<text>
<paragraph>
<line>
<character>g</character>
<character>o</character>
.....
</line>
<line>
<character>k</character>
.....
</line>
</paragraph>
</text>
<text>
<paragraph>
<line>
<character>c</character>
.....
</line>
</paragraph>
</text>文本文件示例:
go..
k..
c..如何以尽可能快的速度使用多线程解析许多xml文件并编写许多文本文件?
我应该从哪里开始解决这个问题呢?我用来解析的方法会影响速度吗?如果影响,哪种方法比其他方法更快?
我没有多线程的经验。如何构建一个有效的多线程结构?
任何帮助都是非常感谢的。提前谢谢。
编辑
我需要些帮助。我用SAX来解析。我做了一些关于线程池,多线程,java8特性的研究.我尝试了一些代码块,但总时间没有变化。如何添加多线程结构或java8功能(Lambda表达式、并行性等)在我的密码里?
发布于 2017-11-03 14:08:36
在这种情况下要注意。
并行性并不总是对运行缓慢的进程的一个解决方案。您通常可以通过使用适当的硬件来提高significantly的吞吐量。
发布于 2017-11-03 13:53:38
首先,您确定需要更快的速度或多线程吗?过早的优化是万恶之源。如果你不小心的话,你可以很容易地使你的程序变得更加复杂,如果你不小心的话,那么多线程当然会使事情变得更加复杂。
然而,对于实际的问题:从以单线程方式解决这个问题开始。然后想一想如何在许多线程中解决这个问题。(例如,拥有一个xml文件和线程池,每个线程在空闲的时候都会抓取一个xml文件,直到池为空),只要您在这个过程中陷入困境,就会返回报告。
用于解析的方法将影响速度,因为不同的解析库具有不同的行为特征。但是,你确定你需要最快的绝对速度吗?
发布于 2017-11-03 18:12:05
如果您使用XSLT (2.0或更高版本)编写代码,使用collection()函数解析源文件,使用xsl:result-document指令编写结果文件,那么您将能够简单地通过在Saxon下运行代码来评估多线程的效果,该代码将多线程自动应用于这些构造。根据我的经验,这类程序的速度通常是3倍左右。
这是使用函数式声明性语言的好处之一:因为没有可变的状态,所以多线程是无痛的。
后来
我将对您关于使用DOM或SAX的补充问题作出答复。从我们可以看到的情况来看,输出文件是输入中的<character>元素的连接,所以如果您用XSLT3.0编写它,则如下所示:
<xsl:mode on-no-match="shallow-skip">
<xsl:template match="characters">
<xsl:value-of select="."/>
</xsl:template>如果是这样的话,那么当然不需要为每个输入文档构建一个树表示,用SAX对其进行编码将相当容易。或者,如果您按照我建议的使用Saxon,您可以使转换流,以避免树的建设。然而,这是否有用取决于源文档的大小。你还没有给我们任何可以使用的数字,所以就性能给出具体的建议几乎是不可能的。
如果要使用基于树的表示,那么DOM是您所能选择的最糟糕的表示形式。这是一个例子,有六个更好的选择,但因为他们只有20%的好,世界上大多数仍然使用DOM,认为它更“标准”。我会选择XOM或JDOM2。
如果您准备花费无限的时间来编写代码以获得最后一盎司的执行速度,那么SAX就是方法之一。然而,对于大多数项目来说,程序员是昂贵的,计算机是便宜的,所以这是错误的权衡。
https://stackoverflow.com/questions/47097337
复制相似问题