Perl 大型下载直接到文件(以避免 RAM 过载)
Perl large download direct to file (to avoid RAM overload)
我正在尝试将大约 1 GB 的文件下载到具有 1 GB RAM 内存的服务器,因此如果我尝试将其下载到变量(下面的代码)中,OS由于 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 ...")
(或 curl 或类似的东西),但我确信有一个正确的方法可以直接使用 Perl。
您是否知道不使用系统调用直接将其下载到文件的方法或选项?
是的。看看LWP::UserAgent
的get
方法:
$ua->get( $url , $field_name => $value, ... )
Fields names that start with ":" are special. These will not initialize headers of the request but will determine how the response content is treated. The following special field names are recognized:
:content_file => $filename
If a $filename is provided with the :content_file
option, then the response content will be saved here instead of in the response object.
注意 - 它可能无法很好地处理文件系统错误,因此请检查您是否可以写入该位置。 (权限、目录存在等)
我正在尝试将大约 1 GB 的文件下载到具有 1 GB RAM 内存的服务器,因此如果我尝试将其下载到变量(下面的代码)中,OS由于 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 ...")
(或 curl 或类似的东西),但我确信有一个正确的方法可以直接使用 Perl。
您是否知道不使用系统调用直接将其下载到文件的方法或选项?
是的。看看LWP::UserAgent
的get
方法:
$ua->get( $url , $field_name => $value, ... )
Fields names that start with ":" are special. These will not initialize headers of the request but will determine how the response content is treated. The following special field names are recognized:
:content_file => $filename
If a $filename is provided with the
:content_file
option, then the response content will be saved here instead of in the response object.
注意 - 它可能无法很好地处理文件系统错误,因此请检查您是否可以写入该位置。 (权限、目录存在等)