2015-05-14 3 views
1

Я пытаюсь получить XML-файл из базы данных с помощью WWW :: Mechanize. Я знаю, что файл довольно большой (больше, чем моя память), и он постоянно падает, либо я пытаюсь просмотреть его в браузере, либо попытаться сохранить его в файле с помощью 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, чтобы получить(), который является частью LWP :: UserAgent.

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

Также обратите внимание, что если все, что вы делаете, это загрузить файл, он не может даже иметь смысл использовать WWW :: Mechanize, и использовать основной LWP :: UserAgent непосредственно.

+1

Спасибо! Ваш ответ был действительно полезен! –

Смежные вопросы