gpt4 book ai didi

excel - Spreadsheet::ParseExcel::Stream 失去解析器

转载 作者:行者123 更新时间:2023-12-01 16:59:41 27 4
gpt4 key购买 nike

我有一个 18M 的 Excel 电子表格需要解析,而 Spreadsheet::ParseExcel 消耗了太多内存,以至于我不得不切换到 Spreadsheet::ParseExcel::Stream 。它在我的虚拟机上运行良好,在我们的临时服务器上运行良好,但在我们的生产服务器(以相同方式配置)上,我收到此错误:

Can't call method "transfer" on an undefined value at \
lib/Spreadsheet/ParseExcel/Stream/XLS.pm line 31.

这来自以下代码:

my ($wb, $idx, $row, $col, $cell);
my $tmp = my $handler = sub {
($wb, $idx, $row, $col, $cell) = @_;
$parser->transfer($main); XXX here's where we die
};

my $tmp_p = $parser = Coro::State->new(sub {
$xls->Parse($file);
# Flag the generator that we're done
undef $xls;
# If we don't transfer back when done parsing,
# it's an implicit program exit (oops!)
$parser->transfer($main)
});
weaken($parser);

弱化看起来很可疑,所以我尝试不弱化,除非引用计数大于 1,但同样的问题发生了。我对代码进行了检测以获取堆栈跟踪并得到了以下结果:

parser is undefined at lib/Spreadsheet/ParseExcel/Stream/XLS.pm line 29.

Spreadsheet::ParseExcel::Stream::XLS::__ANON__ \
('Spreadsheet::ParseExcel::Workbook=HASH(0x6cd4a08)', 0, 2, 1, \
'Spreadsheet::ParseExcel::Cell=HASH(0x1387ce78)') called at \
/usr/share/perl5/Spreadsheet/ParseExcel.pm line 2152
Spreadsheet::ParseExcel::_NewCell( \
'Spreadsheet::ParseExcel::Workbook=HASH(0x6cd4a08)', 2, 1, \
'Kind', 'PackedIdx', 'Val', 'Dean', 'FormatNo', 25, ...) \
called at /usr/share/perl5/Spreadsheet/ParseExcel.pm line 896
Spreadsheet::ParseExcel::_subLabelSST( \
'Spreadsheet::ParseExcel::Workbook=HASH(0x6cd4a08)', 253, 10, \
'\x{2}\x{0}\x{1}\x{0}\x{19}\x{0}2\x{0}\x{0}\x{0}') \
called at /usr/share/perl5/Spreadsheet/ParseExcel.pm line 292
Spreadsheet::ParseExcel::parse( \
'Spreadsheet::ParseExcel=HASH(0x6cd1810)', '2013-09-13.xls') \
called at lib/Spreadsheet/ParseExcel/Stream/XLS.pm line 35
Spreadsheet::ParseExcel::Stream::XLS::__ANON__ \
called at new_importer.pl line 0

这告诉我解析器读取了第一行和第二行,但由于某种原因它在第三行终止了。

我尝试重建 Spreadsheet::ParseExcel::Stream 并且它似乎没有任何错误(所有测试都通过)。我还重新编译了 Coro (相同的结果)。

我很困惑。大家有什么想法吗?

最佳答案

问题变得相当奇怪,看起来像这样的伪代码:

stream1 = open first excel stream
sheet1 = stream1.sheet // get spreadsheet ready for reading

if in verbose mode:
stream2 = open second excel stream
sheet2 = stream2.sheet
count++ while sheet2.get_row
say "We have $count records"

我们发现当且仅当我们处于详细模式时此问题才会出现。通过让两个流指向同一个文档,我们的生产代码将会失败,尽管这在其他机器上运行良好。通过计算行数并在打开常规流来读取文档之前关闭该流,我们解决了问题。

关于excel - Spreadsheet::ParseExcel::Stream 失去解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19122203/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com