我有一个Java应用程序,它读取Microsoft Word文档(* .docx)并从其内容中创建新内容。它在很多方面都是一个简单的批量应用程序。它来自从指定目录中获取的文档列表。它会递归此目录的所有子文件夹,并创建一个字符串列表,这些字符串是docx文档的名称。然后一次处理一个列表。它工作正常,在大约35分钟内处理所有288个文档,并为每个文档生成正确的输出。在它的单线程形式中,它已经被我使用了三年没有问题。在这种情况下"纠正"是我定义的,因为它是我的应用程序。我应该说我很少运行整个288 - 只有在我添加新功能时才会运行。
288份文件中有许多是大型的 - 400页或更多。由于我的PC是Core i7,它有4个内核,每个内核都有两个并发线程,我想同时运行其中一些文件来查看它是否更快。我尝试使用ThreadPoolExecutor
来处理列表,但我在列表中获得了大约20%的StackOverflowError
。显然,StackOverflowError
不是由子文件夹递归引起的。
是否只是确保每个文档创建的对象自己超出范围,或者是否有推荐的方式强制"他们释放内存,比如最后设置为null
?我试图将这两个部分都做成没有成功,我需要一个星期才能完成。是否有更好的或推荐的策略?
docx文件格式(Microsoft称之为Office Open XML)是一个包含XML文件的zip,我使用XSLT将其转换为我自己的格式。这部分非常简单 - 使用Java ZipFile和JAXP。
应用程序是根据库的原则编写的,即包含Shelf
个对象的Book
个对象包含Chapter
个对象。每本书通常有10到20个章节,每本书大约300-500页,目前有288本书,还有100多本。
所有人告诉应用程序超过10,000行代码,因此无法发布代码。我删除了ExecutorService
的几个实验代码行 - 它是一个非常简单的API包装Runnable
,我使用的是来自googlable示例。我将尝试重新制作我所做的一个例子并发布它。