【发布时间】:2011-12-18 17:46:26
【问题描述】:
解析大型 (100 Mb) XML 文件时出现错误“内存不足”
use strict;
use warnings;
use XML::Twig;
my $twig=XML::Twig->new();
my $data = XML::Twig->new
->parsefile("divisionhouserooms-v3.xml")
->simplify( keyattr => []);
my @good_division_numbers = qw( 30 31 32 35 38 );
foreach my $property ( @{ $data->{DivisionHouseRoom}}) {
my $house_code = $property->{HouseCode};
print $house_code, "\n";
my $amount_of_bedrooms = 0;
foreach my $division ( @{ $property->{Divisions}->{Division} } ) {
next unless grep { $_ eq $division->{DivisionNumber} } @good_division_numbers;
$amount_of_bedrooms += $division->{DivisionQuantity};
}
open my $fh, ">>", "Result.csv" or die $!;
print $fh join("\t", $house_code, $amount_of_bedrooms), "\n";
close $fh;
}
我能做些什么来解决这个错误问题?
【问题讨论】:
-
对于大型 XML 文件,您应该依赖面向事件的解析器,例如 SAX。不知道perl,不知道有没有类似的?
-
我不知道这个模块,但是在CPAN 上他们确实提到了如何处理小文件和大文件,而你在这里拥有的是“小”版本。所以也许你可以让你的代码适应“巨大”的实现。
-
@Rubens - 请参阅下面的优秀答案,但简短的版本是“毫无疑问,Perl 有 SAX 解析器”。