有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何高效地并行运行大量文件的XSLT转换?

每次我都必须在一个文件夹内定期转换大量XML文件(至少100K)(基本上是从解压缩的输入数据集),我想学习如何以最有效的方式进行转换。我的技术堆栈由XLT和Saxon XSLT Java库组成,这些库由Bash脚本调用。它运行在一台Ubuntu服务器上,有8个内核和一个Raid的SSD和64Gb的Ram。请记住,我很好地处理了XSLT,但我仍在学习Bash以及如何为这些任务正确分配负载(Java在这一点上也几乎只是一个词)

我以前就这个问题写了一篇帖子,因为我的方法似乎效率很低,实际上需要帮助才能正确运行(见此SOF post。后来有很多评论,用不同的方式来表达这个问题是有意义的,因此这篇文章。有人向我提出了几种解决方案,其中一种目前的效果比我的好得多,但它仍然可以更优雅、更高效

现在,我运行这个:

printf -- '-s:%s\0' input/*.xml | xargs -P 600 -n 1 -0 java -jar saxon9he.jar -xsl:some-xslt-sheet.xsl

我根据以前的一些测试设置了600个进程。更高的值只会抛出来自Java的内存错误。但它现在只使用30到40Gb的Ram(尽管所有8个内核都是100%)

简而言之,以下是我迄今为止的所有建议/方法:

  1. 在子文件夹中拆分整个XML文件(例如,包含每个 5K文件),并使用此方法为每个子文件夹并行运行转换脚本
  2. 具体使用Saxon-EE library(允许 多线程执行)使用collection()函数解析XML文件
  3. 将Java环境设置为任务数较少,或减少 每个进程的内存
  4. 指定有关XSLT表是否与兼容的Saxon libxml/libxslt(它不是只针对XSLT1.0吗?)
  5. 使用专用shell,例如xmlsh

我可以处理解决方案#2,它应该直接启用控制循环并只加载一次JVM;#1看起来更笨拙,我仍然需要在Bash中进行改进(负载分布和性能,处理相对/绝对路径);#3、#4和#5对我来说是全新的,我可能需要更多的解释来了解如何解决这个问题

如有任何意见,将不胜感激


共 (2) 个答案

  1. # 1 楼答案

    尝试使用来自libxslt^{} command line tool。它可以将多个xml文件作为参数。要这样调用它,首先需要创建一个输出目录。试着这样称呼它:

    mkdir output
    xsltproc -o output/ some-xslt-sheet.xsl input/*.xml
    
  2. # 2 楼答案

    “可能的最有效方式”要求很多,通常不是一个合理的目标。例如,我怀疑您是否准备投入6个月的努力,将流程的效率提高3%。您所寻找的是一种实现性能目标的方法,并且可以用最少的努力来实现。而“效率”本身也让人质疑你的衡量标准是什么

    我很自信我提出的设计,用一个单一的转换处理所有的文件,使用集合()和XSL:结果文档(这两个文件都在萨克森EE中并行化)能够给出好的结果,并且可能比我所考虑的其他方法要少得多,也就是说,编写一个Java应用程序来保存“控制逻辑”:尽管如果您擅长编写多线程Java应用程序,那么您可以利用您对工作负载的了解来加快编写速度