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 可能都没有意义。
我正在尝试使用 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 可能都没有意义。