首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >电子表格::ParseExcel::流丢失其解析器

电子表格::ParseExcel::流丢失其解析器
EN

Stack Overflow用户
提问于 2013-10-01 17:19:01
回答 1查看 2.6K关注 0票数 22

我有一个18米的Excel电子表格要解析,而Spreadsheet::ParseExcel占用了太多的内存,以至于我不得不切换到电子表格::ParseExcel::Stream。它在我的VM上运行得很好,在我们的暂存服务器上也很好,但是在我们的生产服务器(配置方式相同)上,我得到了以下错误:

代码语言:javascript
复制
Can't call method "transfer" on an undefined value at \
lib/Spreadsheet/ParseExcel/Stream/XLS.pm line 31.

它来自以下代码:

代码语言:javascript
复制
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,但同样的问题也发生了。我对代码进行了测试,以获得堆栈跟踪,并得到以下内容:

代码语言:javascript
复制
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 (相同的结果)。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-07 13:58:51

这个问题很奇怪,看起来像下面的psuedo代码:

代码语言:javascript
复制
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"

我们发现,如果并且只有当我们处于冗长模式时,这个问题才会显现出来。如果有两个流指向同一个文档,那么我们的生产代码就会失败,尽管这在其他框中可以很好地工作。通过计算行数并在打开常规流以读取文档之前关闭该流,我们解决了这个问题。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19122203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档