我正在构建一个包含百万行的电子表格,其中任何在此过程中完成的操作,都会以百万倍的速度累加。我遇到的问题之一是,在处理单元格中的公式时,我必须解析公式,调整引用,然后重新构建公式。在此过程中,我创建了5-12个字符串(取决于在标记化时有多少对象),然后就不再使用。
我发现垃圾收集器在这个处理过程中占用了70%的时间,并且创建的主要对象随后被收集以释放内存的对象就是这些字符串。
是否有任何方法减少GC(垃圾回收)带来的影响? (如果这是C ++,我会创建一个字符串池以重复使用。)
细节:
这是一个报告程序。我们读取模板,合并数据以生成最终报告,对最终报告进行处理,然后将其写入磁盘。报告作为文档对象保存,在这种情况下,99%是单个表,具有100万行(当所有数据合并时),每行有6个单元格,每个单元格可选:一个公式,一个值和/或格式化文本正文。
在处理过程中,有大量为短时间使用而创建的字符串。它让我困扰的情况是单元格公式的调整。模板中有几个单元格具有公式,例如“=A5 + A6”,然后根据每一行的位置进行调整。我解析出{" A5","+"," A6"}这些对象,然后为它们各自所在的行进行调整,在一个StringBuilder中将这些东西放回到一起,并使用toString()将其分配回单元格中的公式字符串对象。
大多数文档对象写入磁盘的困难之处在于文档对象不是从中读取,操作并写出新文档对象的。为了减少内存占用并处理需要沿列而不是行行走的情况,我们按原样调整对象。问题是当我们的内存不足时 - 整个过程运行得非常快,直到达到该点。我正在使用YourKit来对性能进行分析,并且收集String对象的情况很劣。传递StringBuilder对象可以在一定程度上帮助,但效果并不太大,因为我将会收集很多这样的对象(较少,但仍然很多)。
我发现垃圾收集器在这个处理过程中占用了70%的时间,并且创建的主要对象随后被收集以释放内存的对象就是这些字符串。
是否有任何方法减少GC(垃圾回收)带来的影响? (如果这是C ++,我会创建一个字符串池以重复使用。)
细节:
这是一个报告程序。我们读取模板,合并数据以生成最终报告,对最终报告进行处理,然后将其写入磁盘。报告作为文档对象保存,在这种情况下,99%是单个表,具有100万行(当所有数据合并时),每行有6个单元格,每个单元格可选:一个公式,一个值和/或格式化文本正文。
在处理过程中,有大量为短时间使用而创建的字符串。它让我困扰的情况是单元格公式的调整。模板中有几个单元格具有公式,例如“=A5 + A6”,然后根据每一行的位置进行调整。我解析出{" A5","+"," A6"}这些对象,然后为它们各自所在的行进行调整,在一个StringBuilder中将这些东西放回到一起,并使用toString()将其分配回单元格中的公式字符串对象。
大多数文档对象写入磁盘的困难之处在于文档对象不是从中读取,操作并写出新文档对象的。为了减少内存占用并处理需要沿列而不是行行走的情况,我们按原样调整对象。问题是当我们的内存不足时 - 整个过程运行得非常快,直到达到该点。我正在使用YourKit来对性能进行分析,并且收集String对象的情况很劣。传递StringBuilder对象可以在一定程度上帮助,但效果并不太大,因为我将会收集很多这样的对象(较少,但仍然很多)。