Perl - 机械化对象大小太大

Perl - Mechanize object size too big

我正在尝试使用 WWW::Mechanize 从数据库中获取 xml 文件。我知道该文件非常大(比我的内存大)并且它经常崩溃,无论是我尝试在浏览器中查看它还是尝试使用 get() 将其存储在文件中。我计划将来使用 XML::Twig,但我永远无法将结果存储在文件中。

有谁知道如何将机械化对象分成小块,一个接一个地获取它们,然后一个接一个地存储在一个文件中而不 运行 内存不足?

这里是查询 api: ArrayExpress Programmatic Access .

谢谢。

#!/usr/bin/perl 

use strict;
use warnings;

use WWW::Mechanize;

my $base = 'http://www.ebi.ac.uk/arrayexpress/xml/v2/experiments';
#Parameters
my $query ='?species="homo sapiens"' ;
my $url = $base . $query;

# Create a new mechanize object
my $mech = WWW::Mechanize->new(stack_depth=>0);

# Associate the mechanize object with a URL
$mech->get($url);

#store xml content
my $content = $mech->content;

#open output file for writing
unlink("ArrayExpress_Human_Final.txt");
open( $fh, '>>:encoding(UTF-8)','ArrayExpress_Human_Final.txt') || die "Can't open file!\n";
print $fh $content;
close $fh;

听起来您想做的是将文件直接保存到磁盘,而不是将其加载到内存中。

来自Mech FAQ问题"How do I save an image? How do I save a large tarball?"

You can also save any content directly to disk using the :content_file flag to get(), which is part of LWP::UserAgent.

$mech->get( 'http://www.cpan.org/src/stable.tar.gz',
            ':content_file' => 'stable.tar.gz' );

另请注意,如果您所做的只是下载文件,那么使用 WWW::Mechanize 甚至直接使用基础 LWP::UserAgent 可能都没有意义。