这是程序的工作原理.我有大量遗留格式的文档,我正在尝试将其转换为HTML.遗留格式由几个XML文件组成:描述文档的元数据文件,包含指向任意数量内容文件的链接(通常是一个,但也可以是几个 – 例如,某些文档具有“主要”内容和单独的脚注文件).对于最小的文档,转换需要几毫秒到最大文档的大约58秒.基本上,我正在编写一个美化的XSLT处理器,虽然它的语言比XSLT好得多.
我刚开始在Clojure中编写的当前(相当天真)的方法构建了所有元数据文件的列表,然后执行以下操作:
(let [parsed-trees (map parse Metadata-files)] (dorun (map work-func parsed-trees)))
work-func将文件转换为HTML并将结果写入磁盘,返回nil. (我试图丢弃每个文档的解析后的XML树,这在每次通过单个文档后非常大).我现在意识到虽然map是懒惰的,但是dorun抛弃了它迭代的序列的头部,我在解析树中保持seq头部的事实是我失败的原因.
我的新计划是将解析移动到work-func中,以便它看起来像:
(defn work-func [Metadata-filename] (-> Metadata-filename e/parse xml-to-html write-html-file) (System/gc))
然后我可以使用map或者pmap来调用work-func,因为我有两个双核cpu,并希望在处理完每个文档后丢弃大型XML树.
不过我的问题是:经常告诉Java“请跟我清理”是不是一个好主意?或者我应该跳过work-func中的(System / gc)调用,并在感觉需要时运行Java垃圾收集器?我的直觉是要保持调用,因为我知道(因为Java不能)在work-func的那一点上,堆上会有大量的数据可以被删除,但我欢迎来自更有经验的Java和/或Clojure编码员的意见.
解决方法
原文地址:https://www.jb51.cc/java/128761.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。