2010-06-09 18 views
6

我在使用File :: Slurp的大文件中sl but不已,但考慮到文件的大小,我可以看到我必須在內存中使用它兩次,或者它可能會變成16位unicode。我怎樣才能在Perl中最好地診斷這類問題?我應該使用哪種工具來查找我在Perl中的內存分配?

我拉入的文件大小爲800mb,我的perl進程正在分析在運行時分配的數據大約爲1.6gb。

我意識到我可能對我的問題的理由錯了,但我不確定證明/反駁我的理論的最有效的方法。

更新:

我從犯罪嫌疑人的名單elminated狡猾的字符編碼。看起來我在某個時候複製了變量,我只是無法弄清楚在哪裏。

更新2:

我現在已經做了一些更多的研究,發現它實際上是剛剛從文件:: Slurp的是造成問題的數據。我不得不通過文件一看,發現我能得到它返回一個scalar_ref,即

my $data = read_file($file, binmode => ':raw', scalar_ref => 1); 

然後,我沒有得到我的記憶中的通貨膨脹。這是有道理的,而且在我的情況下獲取數據時最合理。

有關查看變量存在的信息等通常有幫助,但謝謝。

+0

This SO post may be helpful:[我怎樣才能以編程方式確定我的Perl程序在Windows下的內存使用情況?](http://stackoverflow.com/questions/1115743/how-can-i-programmatically-determine-我-perl的 - 程序內存使用情況的下窗戶)。 – Zaid 2010-06-09 14:49:25

+0

這通常是有趣的,雖然它是在這個級別的數據,讓我意識到我有這個錯誤。 – 2010-06-09 14:51:04

+0

sl the整個文件對你的過程是必要的嗎?是否可以逐行分析? – 2010-06-09 15:03:20

回答

4

也許Devel::DumpSizes和/或Devel::Size可以幫忙嗎?我認爲前者在你的情況下會更有用。

Devel :: DumpSizes - 以字節(升序)轉儲腳本中給定點處可用變量的名稱和大小。

傑韋利::大小 - Perl擴展尋找Perl的變量的內存使用情況

4

這裏有記憶問題的一些通用的資源在Perl:

至於你自己的建議,反駁最簡單的方法是寫一個簡單的Perl程序:

  1. 創建一個純文本的大(100M)的文件,可能是剛剛輸出在同一個字符串通過system()通話

  2. 循環到一個文件中,或運行dd命令二進制文件讀取文件使用標準的Perl open()/@a=<>;

  3. 措施內存消耗。

然後重複#2-#3爲您的800M文件。

這將告訴你,如果問題是File :: Slurp,你的程序中的一些奇怪的邏輯,或者文件中的一些特定內容(例如非ascii,儘管如果最終成爲理由)

+0

我確實似乎已經消除了可笑的字符編碼。仔細一看,這個過程開始時與文件大致相同的內存佔用量,然後做了一些東西,檢查它加倍的頭部中的東西。我不明白是什麼原因造成的。 – 2010-06-09 14:59:25

相關問題