我想使用多线程执行文件转换,该如何设置线程池大小

文件转换比较占用内存,我想知道是否有办法判断该使用什么样的线程池配置才是最优解,比如我已经知道文件的类型和大小,当前机器的内存空余等信息

我们目前线程池用的是cpu核心数
Runtime.getRuntime().availableProcessors();

@humanhuman,

一般来说,同一个workbook对象上不支持多线程操作,但是您可以在多线程中操作多个workbook对象,每个workbook一个线程。
对于文件转换占用的内存,即使同样的文件大小,可能因为文件数据的不同导致转换过程中需要的内存大小有很大的差别。如果您的文件都具有相似的数据,您可以使用一些具体的大小不同的文件做测试,来统计大概的内存需求。如果您的文件数据大部分都是单元格数据,您也可以尝试使用内存模式来进行加载和转换(MemorySetting.MemoryPreference)看看是否能帮助您减少内存使用。这部分的介绍您也可以参考此文档

我是用的是docx转换pdf,是否有这种机制,某个文件转换消耗了具体一定内存时,采用某种方法将其中断

@humanhuman, Aspose.Words也是类似的:同一个Document对象不支持多线程操作,但是你可以在多个线程中操作多个Document对象,一个线程一个文档。

关于内存使用,请参考这篇文章:https://docs.aspose.com/words/net/memory-requirements/. 虽然是为.NET写的,但同样适用于Java。 所以没有简单的方法来确定线程池的大小。

好的,如果在内存降低但是没有出现内存溢出的情况下,文件的转换耗时是否会随着内存降低而变慢

@humanhuman, 转换时间主要取决于文档的复杂性。 转换为PDF实际上是一种渲染:Aspose.Words在计算字符和对象在页面上的最终位置之前,会考虑页面属性、段落属性、文本属性、表格属性、图形属性等许多数据 . 当在页面上放置文本、图形和表格时,Aspose.Words 可能会在同一页面上执行多次传递。

内存也可以发挥作用:更多的数据会占用更多的内存,垃圾收集器可以开始工作并减慢转换过程。 可以调整垃圾收集以产生更好的性能:https://docs.oracle.com/en/java/javase/17/gctuning/introduction-garbage-collection-tuning.html