【Aspose.Words for Java】线程在调用 document.updateFileds() 方法时冻结,并且占用了大量内存。

我这边也遇到了同样的问题,请问你的问题解决了吗

@1064287387, 您能否提供有关您遇到的问题的更多详细信息? 您使用什么版本的 Aspose.Words? 请尝试创建尽可能小的文档和程序来演示问题并将其附在此处以供分析。

之前遇到了问题怀疑过是不是版本太老旧了就更新到了最新版本,现在我这边使用的是23.4的版本但是问题仍然会出现,Document doc_processing = new Document(p.toString());
doc_processing.updateFields();
doc_processing.save(p.toString());

上述是我们项目api中使用到的关键代码,我这边用来测试的文件大概是7MB,接口的功能就是简单的上传文件然后更新目录,没有别的操作,我使用的版本是java版本…

要我把我的测试文件发给您么?

@1064287387, 是的,请将文件附加到此线程。 如果文件太大而论坛不允许附加,请将其上传到任何文件共享服务并在此处发布下载链接。

这是测试文件的下载链接:https://aiw-dev.touzhiwang.com/download/files/temp/doc/8e1c60e2f07811edb51512afb67964fc.docx

@1064287387, 您的问题与 Document.updateFields() 方法无关。 因为您的文档有很多页(Microsoft Word 显示为 4011),Aspose.Words 需要一些时间才能将这么大的文档转换为 PDF。 高内存使用率也是由大量页面引起的。 目前,除了缩小文档之外,您无法加快转换过程。 事实上,Microsoft Word 也需要一些时间才能打开此文档。

以下是在我的电脑上进行的一些测量:

// Load time: 4.261147 sec
Document doc = new Document("8e1c60e2f07811edb51512afb67964fc.docx");
// Conversion time: 38.9781692 sec
doc.save("out.pdf", opts);
// Load time: 4.294303
Document doc = new Document("8e1c60e2f07811edb51512afb67964fc.docx");
// Update time: 14.9258709
doc.updateFields();
// Conversion time: 24.5803312
doc.save("out.pdf", opts);
// Update + conversion: 14.9258709 + 24.5803312 = 39.5062021
// Load time: 4.3852224
Document doc = new Document("8e1c60e2f07811edb51512afb67964fc.docx");

// Disable field update
PdfSaveOptions opts = new PdfSaveOptions();
opts.setUpdateFields(false);

// Conversion time: 38.7098146
doc.save("out.pdf", opts);

可以看到,updateFields()方法几乎不影响Word文档的总转换时间。

denis, 文档页数是比较多,但目前文档仅7M,内存占用需要1G多(我们这边都是这种比较大的文档),而且并发调用时,内存每个文档都要大量内存,很容易就导致内存溢出。有没有什么方式可以降低或避免内存占用过多?另外updateFields时间也很长,此文档大概需要300多秒,有办法可以加快速度吗?感谢您的回复。

@1064287387, 目前没有任何方法可以加快大文档的处理速度或减少大文件的内存使用。 这是一个已知问题,但是您使用如此大文档的用例非常罕见。

内存使用量不取决于文件大小,而是取决于为文档内容创建的对象数。 Aspose.Words 为文本跨度、表格、段落属性、页面属性等创建对象。 因此,包含文本跨度、表格等的页面越多,意味着 Aspose.Words 将文档转换为 PDF 需要更多的内存。