스프레드시트::구문 분석 Excel:: 스트림 파서 손실
해석해야 할 18M Excel 스프레드시트가 있습니다.Spreadsheet::ParseExcel
메모리를 너무 많이 사용하여 스프레드시트로 전환해야 했습니다.:구문 분석 Excel::스트림.VM에서 정상적으로 작동하고 스테이징 서버에서도 정상적으로 작동하지만 프로덕션 서버(동일하게 구성됨)에서 다음 오류가 발생합니다.
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
의심스러워 보여서 ref count가 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
(동일한 결과).
이상해요.아이디어 있는 사람?
문제는 다소 이상한 것으로 밝혀졌으며 다음과 같은 puedo 코드로 표시됩니다.
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"
우리는 우리가 장황한 모드에 있을 때에만 이 문제가 나타날 것이라는 것을 발견했습니다.두 개의 스트림이 동일한 문서를 가리키도록 함으로써 우리의 생산 코드는 실패할 수 있지만 다른 상자에서는 이것이 잘 작동했습니다.문서를 읽기 위해 일반 스트림을 열기 전에 행 수를 세고 해당 스트림을 닫음으로써 문제를 해결했습니다.
언급URL : https://stackoverflow.com/questions/19122203/spreadsheetparseexcelstream-losing-its-parser
'programing' 카테고리의 다른 글
Entity Framework를 사용하여 SQL Server 데이터베이스의 변경 내용을 저장하는 동안 하나 이상의 엔티티에 대한 유효성 검사에 실패했습니다. (0) | 2023.04.28 |
---|---|
iOS 7 탐색 모음 텍스트 및 화살표 색상 (0) | 2023.04.28 |
VBA를 사용하여 Excel 워크시트 숨기기 (0) | 2023.04.28 |
종속성 속성을 선택해야 하는 이유 (0) | 2023.04.28 |
Wpf 텍스트 블록의 수직 텍스트 (0) | 2023.04.28 |