无法使用Excel :: Writer :: XLSX导出大型数据集

我似乎无法使用Excel :: Writer :: XLSX将超过85,000行导出到.xlsx文件。 导出超过85,000行的数据会生成一个5KB文件,其中没有数据。 在导出85,000条logging或90,000条logging(大约40秒)时,该脚本的运行时间大致相同。

85,000行的文件是7.9MB,而90,000行的文件只有5KB。

使用top监视导出脚本,我的perl脚本只显示大约1%的内存使用量,几秒钟后就消失了。 我是新来的使用Perl,所以我不知道是否有另一个进程,我应该监测,看看它是否内存不足。

当导出85,000行或更less的行时,perl脚本实际上显示大约7%的内存使用量,并且在导出完成之前它仍然保留在进程列表中。

我试了下面的程序来生成一个90,000×20的工作表,输出文件很好。 它比你所报告的(〜6MB)要小一些,但是有压缩,所以它取决于input数据:

#!/usr/bin/perl -w use strict; use warnings; use Excel::Writer::XLSX; my $workbook = Excel::Writer::XLSX->new('bigfile.xlsx'); $workbook->set_optimization(); my $worksheet = $workbook->add_worksheet(); $worksheet->set_column(0, 50, 18); for my $row (0 .. 90000 -1) { for my $col (0 .. 20 -1) { $worksheet->write($row, $col, "Row: $row Col: $col"); } } __END__ 

我唯一的其他build议是确保您使用的是Excel :: Writer :: XLSX> = 0.51版本,因为之前在优化模式下存在内存泄漏。

之后,我认为你应该提交一个错误报告。 确保附上由Excel :: Writer :: XLSX bug_report.pl程序生成的输出。

有两件事你可以尝试解决这个问题。

  1. 如果析构函数中的隐式closures以某种方式被阻止,则将明确的Workbook close()添加到程序的末尾。
  2. 尝试set_optimisation()模式,以防您的进程内存不足。