使用perl時調用map { function($_) } <FILEHANDLE>;
是否將整個文件加載到內存中?具有映射和文件句柄的Perl內存使用情況
回答
是的 - 或者至少我是這樣解釋這個結果的。
$ perl -e "map {0} <>" big_data_file
Out of memory!
$ perl -e "map {0} 1 .. 1000000000"
Out of memory!
有人可能會懷疑我們是否耗盡內存,因爲Perl是嘗試存儲的map
輸出。然而,我的理解是,Perl被優化以避免在無效環境中調用map
時的工作。有關具體示例,請參閱this question中的討論。
也許更好的例子:基於評論
$ perl -e "sub nothing {} map nothing(), <>" big_data_file
Out of memory!
,看來這個問題是由一個願望,一種簡潔的語法處理大量數據時的動機。
open(my $handle, '<', 'big_data_file') or die $!;
# An ordinary while loop to process a data file.
while (my $line = <$handle>){
foo($line);
}
# Here Perl assigns each line to $_.
while (<$handle>){
foo($_);
}
# And here we do the same thing on one line.
foo($_) while <$handle>;
你問我假設的問題是:是否map
功能啜食文件它開始處理之前,或是否通過線使用線。
讓我們做有關處理列表的快速比較:
while (<FILEHANDLE>) { ... }
這個案例清楚地線採用線。每次迭代,獲取$_
的新值。
for my $line (<FILEHANDLE>) { ... }
在這種情況下,LIST
是在循環開始之前擴大。在http://perldoc.perl.org/functions/map.html中有一個對map
的引用,它類似於foreach
循環,我確信LISTs
在被傳遞給函數之前被展開。
我不認爲它在這種情況下是沒有爭議的:'map {print FILEHANDLE function($ _)}
@Eric是的,你說得對..沒有明確的答案,因爲地圖可以做任何想做的事情。我會刪除那部分.. – TLP 2011-05-22 15:38:41
是的,操作數爲map
,foreach循環和子呼叫在map
之前被評估,foreach循環或子呼叫甚至開始。
一個例外:
for my $i (EXPR_X..EXPR_Y)
(有或無my $i
)被優化成一個計數循環,沿
my $x = EXPR_X;
my $y = EXPR_Y;
for (my $i = $x; $i <= $y; ++$i)
Perl6線的東西都會有惰性列表的原生支持。
你是什麼意思的「子呼叫?」 – 2011-05-23 04:09:52
@Eric Pruitt,'f()',參數是操作數。 – ikegami 2011-05-23 18:36:35
- 1. 內存映射文件和實際內存使用情況如何?
- 2. 將線程映射到其內存使用情況的工具?
- 3. 內存映射文件的使用
- 4. 何時使用內存映射文件?
- 5. 使用FindFile和文件句柄在C++中的內存泄漏
- 6. perl:在內存中的文件句柄sysread?
- 7. Perl glob和文件句柄問題
- 8. 內存映射文件C++
- 9. 內存映射文件.NET
- 10. Windows內存映射文件
- 11. 內存映射文件
- 12. Java內存映射文件和交換
- 13. FILE_FLAG_DELETE_ON_CLOSE和內存映射文件
- 14. Java - 內存映射文件和刷新
- 15. Cassandra SSTable和內存映射文件
- 16. 獲取文件系統句柄到藍牙映射文件夾
- 17. 內存映射文件有多大?
- 18. 如何在不使用文件句柄的情況下獲取文件索引?
- 19. 如何限制內存映射文件的內存使用
- 20. 如何在沒有窗口句柄的情況下使用RegisterDeviceNotification?
- 21. 如何在perl中使用my關鍵字和文件句柄?
- 22. 如何在Perl類中存儲和訪問文件句柄?
- 23. 寫文件(句柄)的內容,以不同的文件句柄
- 24. 用於提取內存和文件句柄計數的C API
- 25. 的FileStream和內存使用情況
- 26. @ModelAttribute和@SessionAttributes的內存使用情況
- 27. 寫入內存映射文件比非內存映射文件慢
- 28. 內存映射文件 - 映射結構而不是文件?
- 29. Flash總內存使用情況和TaskManager內存使用情況不一樣?
- 30. Windows內存和頁面文件的使用情況
一個簡單的測試用例。謝謝。 – 2011-05-22 15:34:31
實際上,在這兩種情況下,你都要用'0'值加載一個列表。如果您使用for循環並將數字「推」到數組,則會得到相同的錯誤。雖然在這種情況下,它並不是即時的。 – TLP 2011-05-22 15:47:27
雖然我沒有將返回的數據加載到數組中, 'map {print FILEHANDLE function($ _)};'。我只是喜歡在小操作上使用map而不是foreach。 –
2011-05-22 15:52:04