我必须每次定期在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%)。
简而言之,到目前为止,所有建议/方法:
collection()
函数解析XML文件libxml/libxslt
(仅适用于XSLT1.0?)xmlsh
我可以处理解决方案#2,它应该直接启用控制循环并只加载JVM一次; #1似乎更笨拙,我还需要改进Bash(负载分配和性能,处理相对/绝对路径); #3,#4和#5对我来说是全新的,我可能需要更多解释来了解如何解决这个问题。
非常感谢任何输入。
答案 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