为有中文需求的客户提供多渠道中文技术支持.

Thu Oct 17, 2024 8:12 am

1.目前因为生成的文档的比较大 产生的对象很多导致了内存溢出问题
2.通过内存分析过后主要产生的对象有Paragraph、Table......
3.目前在文档中看到的主动回收资源 document.close() 和 document.dispose(),请问一下还有其他回收资源的方法或者方案吗?
4.请问spire.doc.java是在最后document.saveToFile()保存文档过后,才会将相关对象进行回收吗?有没有内存优化方案呢?

Zy13537531345
 
Posts: 7
Joined: Thu Oct 17, 2024 8:06 am

Thu Oct 17, 2024 9:43 am

您好,

感谢您的留言。请问你目前使用的是我们的商业版进行测试吗?如果不是,请更新后再进行测试,因为商业版包含了更多的修复和优化。另外,除了主动调用document.close()和 document.dispose()外,没有其它可以主动释放资源的接口,当调用了这两个方法后,我们的产品内部会进行释放资源的操作。如果使用最新版本测试后问题仍然存在,可以将你的测试代码和输入文档(如果有的话)提供给我们调查以帮助你解决这个问题。您可以在此处上传或通过电子邮件(Amin.gan@e-iceblue.com)发送给我们。提前感谢。

Sincerely,
Amin
E-iceblue support team
User avatar

Amin.Gan
 
Posts: 281
Joined: Mon Jul 15, 2024 5:40 am

Tue Oct 22, 2024 3:09 am

我们正在使用商业版进行评估:
1.请问贵公司做过性能测试的吗?大概是多少页word呢
2.因为本公司需求可能生成的word在3千页左右,目前出现性能瓶颈无法生成
3.目前思路:可以通过分类分页去生成相关内容吗?可以帮我看一下我这个方案的可行性吗?
a.生成一组页面持久到文件过后就将对象销毁回收
b.然后通过官方文档提供的拼接word的方案进行合并
c.使用document.insertTextFromFile()方法进行合并的时候,性能消耗是怎样的呢?
因为没有源码,不知道该方法是否如何进行操作的;
不知道是不是在加载新旧word文档的时候,会把新旧word文档中存在的对象进行解析载入,再将新文档的相关对象拼在旧文档对象的后面进行保存,因为我看到拼接文档时会有 document.saveToFile()方法故而发出疑问(性能消耗很大)
还是贵公司做过相应优化直接就拼接(性能消耗较小)

Zy13537531345
 
Posts: 7
Joined: Thu Oct 17, 2024 8:06 am

Tue Oct 22, 2024 3:11 am

//拼接文档方法:
public class merge {
public static void main(String[] args) {
//创建 Document 类的对象并从磁盘加载 Word 文档
Document document = new Document("C:/示例/示例1.docx");

//将另一个文档插入当前文档
document.insertTextFromFile("C:/示例/示例2.docx", FileFormat.Docx_2013);

//保存结果文档
document.saveToFile("合并结果.docx", FileFormat.Docx_2013);
}
}

Zy13537531345
 
Posts: 7
Joined: Thu Oct 17, 2024 8:06 am

Tue Oct 22, 2024 7:59 am

您好,

感谢您的反馈。内存占用的大小和很多因素有关,Word文档内容结构,服务器可用内存等。我在本地(win10,16G)模拟了一次性生成3000页的Word文档,其中每页包含一个表格和一段文字,运行时占用的内存为1.4G左右。随后,我再测试了将3000个一页的Word文档合并到一个文档,运行的占用内存随着运行时间的增加也达到了1.4G左右,这也仅是一个参考。在使用Spire.Doc操作Word时,我们产品需要将Word文档进行解析,特别是如果涉及较多图片的文档,占用内存会更高一些。因此对于你的情况,你可以先用我们最新商业版进行一个具体测试,同时测试时建议可以增加JVM的内存。如果还是存在问题,你可以上传你的较大文档然后提供下载链接给我们,我们进一步验证给你适当的解决方案。

Sincerely,
Amin
E-iceblue support team
User avatar

Amin.Gan
 
Posts: 281
Joined: Mon Jul 15, 2024 5:40 am

Tue Oct 22, 2024 8:23 am

设置jvm过后进行测试,发现耗时很长
1.请问一下在测试生成3000页文档,耗时用了多久呢?
2.我在减少数据量过后进行生成出近一千页的word 耗时:1个半小时的样子,我这边的文档内容一个表格有很多数据,详情见文件
3.因为在同时我还需要生成出一份pdf文档
1.直接通过doc.saveToFile("WordToPDF.pdf",FileFormat.PDF)方法生成,和word(近千页)时 一共耗时近3h20m
2.通过word转换为pdf方案耗时也有近1个小时,麻烦贵公司测一下通过我上传的word文档转换为pdf文档需要多少时间呢?

Zy13537531345
 
Posts: 7
Joined: Thu Oct 17, 2024 8:06 am

Tue Oct 22, 2024 10:04 am

您好,

感谢您的回复。我本地模拟的测试一次性生成3000页Word文档大约耗时在20秒左右,但是我生成的Word中每页的数据是相同的。同时我查看了附件中的Word文档,发现大部分都是表格,在绘制较多表格时的确会更耗内存和时间,你的系统内存是多大的呢?无论如何,我们内部也一直在逐步优化绘制表这部分的性能。另外,我将其转换为PDF文档耗时在18分钟左右。

Sincerely,
Amin
E-iceblue support team
User avatar

Amin.Gan
 
Posts: 281
Joined: Mon Jul 15, 2024 5:40 am

Wed Oct 23, 2024 5:52 am

请问你们那边用的机器的参数是什么样子的呢?
我今天重新测试了一下将我上传的文件word文档转为pdf 耗时:1个小时

Zy13537531345
 
Posts: 7
Joined: Thu Oct 17, 2024 8:06 am

Wed Oct 23, 2024 7:00 am

您好,

感谢您的回复。我本地的系统是Windows 10,16G,4核心的配置,测试的JDK版本是JDK11。同样我也再次进行了转换,耗时仍然在18分钟左右。你那边耗时1个小时,是否是在单线程的情况下测试呢?如果你的系统运行内存太小或者系统核心数量太少,可能导致你的运行时间更长。

Sincerely,
Amin
E-iceblue support team
User avatar

Amin.Gan
 
Posts: 281
Joined: Mon Jul 15, 2024 5:40 am

Wed Oct 23, 2024 7:24 am

我本地是使用单线程进行转换
你是用的这个方法进行的转换的吗?如果不是的话可以将你那边进行转换的代码复制一份给我看看吗?
这个方法还能开启多线程进行转换吗?
Code: Select all
//拼接文档方法:
public class merge {
public static void main(String[] args) {
//创建 Document 类的对象并从磁盘加载 Word 文档
Document document = new Document();
document.loadFromFile("C:/示例/示例2.docx");
//保存结果文档
document.saveToFile("合并结果.docx", FileFormat.PDF);
}
}
Last edited by Zy13537531345 on Wed Oct 23, 2024 8:00 am, edited 1 time in total.

Zy13537531345
 
Posts: 7
Joined: Thu Oct 17, 2024 8:06 am

Wed Oct 23, 2024 7:57 am

您好,

感谢您的回复。你附上的代码是通过插入完整文档来实现合并多个Word文档,我测试的是将附件中的Word文档转换为PDF文档,使用的是下面的代码。另外,这个方法本身不能开启多线程转换,只能够单线程转换同一个Word文档。
Code: Select all
LicenseProvider.setLicenseKey("your key");
        long startTime = System.currentTimeMillis();
        // Create a new Document object
        Document document = new Document();

        // Load a Word document from the specified file path
        document.loadFromFile("11948616\\11948616.docx");

        // Save the document as a PDF file
        document.saveToFile("11948616\\11948616_two.pdf",FileFormat.PDF);

        // Dispose of the Document object to free up resources
        document.dispose();

        long endTime = System.currentTimeMillis();
        long duration = endTime - startTime;
        System.out.println("运行时长: " + duration + " 毫秒");

Sincerely,
Amin
E-iceblue support team
User avatar

Amin.Gan
 
Posts: 281
Joined: Mon Jul 15, 2024 5:40 am

Thu Oct 24, 2024 1:58 am

你好

我现在用较少数据量进行生成文档,在生成文档的最后使用doc.dispose() 和 doc.close() 方法,单个使用和合并一起使用都尝试过进行回收资源
但是我在Java VisualVM中监控内存占用,在生成文档过后内存的占用没有下来,中途是有小部分的对象被回收,但是总体占用还是偏高
我看抽样器中的内存
1.com.spire.doc.packages.sprugp
2.com.spire.doc.packages.spromr
3.com.spire.doc.formatting.Border
4.com.spire.doc.packages.sprgdp
........
很多关于spire.doc的大量对象还存活
因此我想问一下doc.dispose() 和 doc.close() 会彻底回收资源吗?
我现在这边的情况就是启动项目内存正常,调用生成文档的接口内存持续占用,生成文档过后内存折线图波动但后面内存占用就和在生成文档时的内存差不多占用

Zy13537531345
 
Posts: 7
Joined: Thu Oct 17, 2024 8:06 am

Thu Oct 24, 2024 8:53 am

您好,

感谢您的回复。我们需要你的完整测试代码(如果有输入文件请一并提供给我们)和运行环境进行调查分析,因为我们需要根据实际情况来优化对应的对象释放。

Sincerely,
Amin
E-iceblue support team
User avatar

Amin.Gan
 
Posts: 281
Joined: Mon Jul 15, 2024 5:40 am

Return to 中文技术支持