使用Excel :: Writer :: XLSX导出大型数据集时出现问题

时间:2013-02-19 17:53:19

标签: perl excel export

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

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

使用top监视导出脚本,我的perl脚本只显示大约1%的内存使用量,并在几秒后消失。我是新手使用perl所以我不确定是否还有另一个进程我应该监视它是否内存不足。

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

2 个答案:

答案 0 :(得分:2)

我尝试了以下程序来生成90,000x20工作表,输出文件很好。它比你报告的要小一些(~6MB)但是有压缩因此它取决于输入数据:

#!/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__

我唯一的另一个建议是确保您使用的是Excel :: Writer :: XLSX> = 0.51的版本,因为在此之前优化模式中存在内存泄漏。

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

答案 1 :(得分:1)

您可以尝试解决此问题。

  1. 在程序结尾添加一个显式工作簿close(),以防析构函数中的隐式关闭以某种方式被阻止。
  2. 如果您的进程内存不足,请尝试set_optimisation()模式。