2015-05-14 54 views
1

我想從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; 

回答

3

聽起來像你想要做的是直接將文件保存到磁盤,而不是將其加載到內存中。

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

謝謝!你的答案真的很有幫助! –