1

我似乎无法使用 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 的新手,所以我不确定是否应该监视另一个进程以查看它是否内存不足。

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

4

2 回答 2

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程序生成的输出。

于 2013-02-20T15:38:27.823 回答
1

您可以尝试两件事来解决此问题。

  1. 将显式 Workbook close()添加到程序末尾,以防析构函数中的隐式关闭以某种方式被阻止。
  2. 如果您的进程内存不足,请尝试set_optimisation()模式。
于 2013-02-19T21:24:46.703 回答