2016-11-08 111 views
3

我試圖下載一個文件與1 GB的aproximated大小到1 GB的RAM內存的服務器,所以如果我嘗試下載到一個變量(代碼如下),操作系統會因RAM過載而殺死進程。Perl大的下載直接到文件(以避免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做一個正確的方式的唯一途徑。

你知道任何方法或選項,直接下載到一個文件,而無需使用系統調用?

回答

8

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

$ UA->獲取($網址,$ FIELD_NAME => $值,...)

,與開始的字段名 「:」 是特殊的。這些將不會初始化請求的標題,但會決定如何處理響應內容。下面的專業名稱是公認的:

:content_file => $filename 

如果$文件名設置有:content_file選項,那麼響應內容將保存在這裏,而不是在響應對象。

注 - 它可能不會很好地處理文件系統錯誤,所以檢查你可以寫入該位置。 (權限,目錄存在等)

+0

就是這樣!已經下載,謝謝。 – nanocv