Tôi có một lỗi "Hết bộ nhớ" trong khi phân tích lớn (100 Mb) tập tin XML"Hết bộ nhớ" trong khi phân tích lớn (100 Mb) tập tin XML sử dụng perl
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;
}
gì tôi có thể làm thế nào để khắc phục vấn đề lỗi này?
Đối với các file XML lớn, bạn nên dựa vào phân tích cú pháp theo định hướng sự kiện, như SAX. Tôi không biết perl, nhưng bạn có biết nếu có cái gì đó tương tự? –
Tôi không biết mô-đun này, nhưng có trên [CPAN] (http://search.cpan.org/perldoc?XML::Twig) họ đề cập đến cách xử lý các tệp nhỏ so với lớn và những gì bạn có ở đây là phiên bản cho "nhỏ". Vì vậy, có lẽ bạn có thể thích ứng với mã của bạn để thực hiện "rất lớn". – TLP
@Rubens - xem câu trả lời tuyệt vời bên dưới, nhưng phiên bản ngắn là "Chắc chắn, Perl có trình phân tích cú pháp SAX". – DVK