Perl大量下载直接到文件(以避免RAM过载)

时间:2016-11-08 17:19:12

标签: perl download out-of-memory large-files

我试图将1 GB的近似大小的文件下载到具有1 GB RAM内存的服务器,因此如果我尝试将其下载到变量(下面的代码)中,操作系统将终止该过程RAM过载。

require LWP::UserAgent;

my $ua = LWP::UserAgent->new;
$ua->timeout(3600);
$ua->env_proxy;

my $response = $ua->get('http://example.com/largefile.xml');

if ($response->is_success) {
    print "File downloaded\n";
}
else {
    die $response->status_line;
}

我认为唯一可行的方法是使用system("wget ...")(或卷曲或类似的东西),但我确信有正确的方法可以直接使用Perl。

您是否知道在不使用系统调用的情况下将其直接下载到文件的方法或选项?

1 个答案:

答案 0 :(得分:8)

是的。查看LWP::UserAgentget方法:

  

$ ua-> get($ url,$ field_name => $ value,...)

     

以"开头的字段名称:"很特别。这些不会初始化请求的标头,但会确定如何处理响应内容。识别以下特殊字段名称:

:content_file   => $filename
  

如果:content_file选项提供了$ filename,则响应内容将保存在此处而不是响应对象中。

注意 - 它可能不会很好地处理文件系统错误,因此请检查您是否可以写入该位置。 (权限,目录存在等)