Perl - 机械化对象大小太大

时间:2015-05-14 13:47:16

标签: perl www-mechanize chunks

我正在尝试使用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;

1 个答案:

答案 0 :(得分:3)

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

Mech FAQ问题"如何保存图片?如何保存大型tarball?"

  

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

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

另请注意,如果您正在下载文件,那么使用WWW :: Mechanize甚至可能没有意义,直接使用底层LWP :: UserAgent。