【问题标题】:Trouble exporting large dataset using Excel::Writer::XLSX使用 Excel::Writer::XLSX 导出大型数据集时遇到问题
【发布时间】:2013-02-20 23:38:27
【问题描述】:

我似乎无法使用 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% 的内存使用量,并且在导出完成之前它一直保留在进程列表中。

【问题讨论】:

  • 在重新阅读模块文档的limitations 部分后,您可能想要file a bug。除此之外,如果没有看到显示问题的实际代码,我将无法提供帮助。

标签: perl excel export


【解决方案1】:

我尝试了以下程序来生成一个 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 程序生成的输出。

【讨论】:

  • 问题不在于 Excel::Writer::XLSX,而是我通过 $ua = LWP::UserAgent->new; 加载的 JSON 数据的问题; $ua->get($url);我通过限制我撤回的结果并将它们写入工作表来解决这个问题。然后我再次调用 $ua->get($url) 并更新限制,以带回下一个数据块,直到我加载所有数据然后关闭工作簿。
【解决方案2】:

您可以尝试两种方法来解决此问题。

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

【讨论】:

  • 我正在使用 $workbook->set_optimization() 并且在使用 $worksheet->write() 循环之后我已经有了 $workbook->close() 我必须添加 $workbook-> close() 因为我在创建文件后移动它。但是,即使我删除了移动文件的代码并使用 $workbook->close() 结束脚本,我仍然无法导出超过 85,000 条记录。
猜你喜欢
  • 2011-09-16
  • 2020-11-19
  • 1970-01-01
  • 1970-01-01
  • 2023-01-24
  • 2019-08-25
  • 1970-01-01
  • 2016-11-14
  • 2013-05-31
相关资源
最近更新 更多