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

时间:2017-03-31 12:51:15

标签: java bash xslt saxon libxslt

我必须每次定期在1个文件夹中转换大量的XML文件(最小100K)(基本上,从解压缩的输入数据集),并且我想学习如何以最有效的方式做到这一点尽可能的方式。我的技术堆栈包括XLT和Saxon XSLT Java库,从Bash脚本调用。它运行在一个带有8个内核的Ubuntu服务器和一个带有64Gb Ram的Raid of SSD上。请记住,我处理得很好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
  6. 我可以处理解决方案#2,它应该直接启用控制循环并只加载JVM一次; #1似乎更笨拙,我还需要改进Bash(负载分配和性能,处理相对/绝对路径); #3,#4和#5对我来说是全新的,我可能需要更多解释来了解如何解决这个问题。

    非常感谢任何输入。

2 个答案:

答案 0 :(得分:0)

"最有效的方式"要求很多,通常不是一个合理的目标。例如,我怀疑你是否愿意在6个月内投入使用。努力将该过程的效率提高3%。您正在寻找的是一种满足性能目标的方法,并且可以轻松实施。并且"效率"本身就会引发有关您的指标的问题。

我非常确信我所建议的设计,使用collection()和xsl:result-document(它们都在Saxon-EE中并行化)处理所有文件的单个转换能够提供良好的效果结果,并且可能比我考虑的唯一其他方法少得多,即编写一个Java应用程序来保存控制逻辑"尽管如果你擅长写作多线程Java应用程序然后你可以通过利用你对工作负载的了解来加快速度。

答案 1 :(得分:0)

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

mkdir output
xsltproc -o output/ some-xslt-sheet.xsl input/*.xml