首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在java中使用多线程解析和编写txt文件

在java中使用多线程解析和编写txt文件
EN

Stack Overflow用户
提问于 2017-11-03 13:48:04
回答 3查看 914关注 0票数 0

我有很多xml文件。每个xml文件都包含太多的行和标记。在这里,我必须解析它们并使用xml的文件名编写.txt文件。这需要尽快完成。越快越好。

xml文件示例:

代码语言:javascript
复制
<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>

文本文件示例:

代码语言:javascript
复制
go..
k..

c..

如何以尽可能快的速度使用多线程解析许多xml文件并编写许多文本文件?

我应该从哪里开始解决这个问题呢?我用来解析的方法会影响速度吗?如果影响,哪种方法比其他方法更快?

我没有多线程的经验。如何构建一个有效的多线程结构?

任何帮助都是非常感谢的。提前谢谢。

编辑

我需要些帮助。我用SAX来解析。我做了一些关于线程池,多线程,java8特性的研究.我尝试了一些代码块,但总时间没有变化。如何添加多线程结构或java8功能(Lambda表达式、并行性等)在我的密码里?

EN

回答 3

Stack Overflow用户

发布于 2017-11-03 14:08:36

在这种情况下要注意。

  1. 在许多情况下,尝试使用多线程同时写入多个文件是完全没有意义的。所有这些通常做的是做更多的磁盘头,超出必要。
  2. 写入磁盘,而解析也可能是一个瓶颈。最好将xml解析为缓冲区,然后一次性将整个缓冲区写入磁盘。
  3. 解析器的速度不太可能显著影响整个过程的时间。您的系统几乎肯定会花费更多的时间来阅读和写入而不是解析。
  4. 快速检查一些真实的测试数据将是非常宝贵的。尝试得到一个好的估计的时间,你将,而不是能够影响。
    • 通过将几千个示例文件读入内存来确定一个近似的总读取时间,因为无论进程如何并行,仍然需要占用该时间。
    • 以类似的方式估计一个近似的总写入时间
    • 将两者相加,并将其与读取、解析和写入这些相同文件的总执行时间进行比较。这将使您很好地了解通过并行可以节省多少时间。

并行性并不总是对运行缓慢的进程的一个解决方案。您通常可以通过使用适当的硬件来提高significantly的吞吐量。

票数 3
EN

Stack Overflow用户

发布于 2017-11-03 13:53:38

首先,您确定需要更快的速度或多线程吗?过早的优化是万恶之源。如果你不小心的话,你可以很容易地使你的程序变得更加复杂,如果你不小心的话,那么多线程当然会使事情变得更加复杂。

然而,对于实际的问题:从以单线程方式解决这个问题开始。然后想一想如何在许多线程中解决这个问题。(例如,拥有一个xml文件和线程池,每个线程在空闲的时候都会抓取一个xml文件,直到池为空),只要您在这个过程中陷入困境,就会返回报告。

用于解析的方法将影响速度,因为不同的解析库具有不同的行为特征。但是,你确定你需要最快的绝对速度吗?

票数 0
EN

Stack Overflow用户

发布于 2017-11-03 18:12:05

如果您使用XSLT (2.0或更高版本)编写代码,使用collection()函数解析源文件,使用xsl:result-document指令编写结果文件,那么您将能够简单地通过在Saxon下运行代码来评估多线程的效果,该代码将多线程自动应用于这些构造。根据我的经验,这类程序的速度通常是3倍左右。

这是使用函数式声明性语言的好处之一:因为没有可变的状态,所以多线程是无痛的。

后来

我将对您关于使用DOM或SAX的补充问题作出答复。从我们可以看到的情况来看,输出文件是输入中的<character>元素的连接,所以如果您用XSLT3.0编写它,则如下所示:

代码语言:javascript
复制
<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就是方法之一。然而,对于大多数项目来说,程序员是昂贵的,计算机是便宜的,所以这是错误的权衡。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47097337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档