Perl - 机械化对象尺寸太大

问题描述:

我想从WWW :: Mechanize的数据库中获取一个xml文件。我知道这个文件相当大(比我的内存大),并且它不断崩溃,我试图在浏览器中查看它,或尝试使用get()存储在文件中。我打算将来使用XML :: Twig,但我无法将结果存储在文件中。Perl - 机械化对象尺寸太大

有没有人知道如何在小块中分割机械化对象,一个接一个地获取它们,并将它们存储在一个文件中,一个接一个不会耗尽内存?

以下是查询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问题“如何保存图像?我如何保存一个大的压缩包?”

您还可以使用:content_file标志将任何内容直接保存到磁盘get(),它是LWP :: UserAgent的一部分。

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

另外请注意,如果你正在做的是下载文件,甚至有可能不会是有意义的使用WWW ::机械化,并直接使用底层的LWP :: UserAgent的。

+1

谢谢!你的答案真的很有帮助! –