Spreadsheet :: ParseExcel :: Stream丢失其parsing器

我有一个18M Excel电子表格来parsing和Spreadsheet::ParseExcel消耗了太多的内存,我不得不切换到Spreadsheet :: ParseExcel :: Stream 。 它在我的虚拟机上工作正常,它在我们的登台服务器上工作正常,但在我们的生产服务器上(configuration方式相同),我得到这个错误:

 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); 

这个weaken看起来很可疑,所以我试图不削弱,除非这个人数大于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 

这告诉我,parsing器读取第一行和第二行,但由于某种原因,它死在第三行。

我已经尝试重buildSpreadsheet::ParseExcel::Stream ,它似乎没有任何错误(所有的testing通过)。 我也重新编译了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" 

我们发现,当且仅当我们处于详细模式时,这个问题才会出现。 通过将两个stream指向同一个文档,我们的生产代码将会失败,尽pipe这在其他的盒子上工作得很好。 通过计算行数并打开常规stream读取文档之前closures该stream,我们解决了这个问题。