Perl 板


LINE

大家好 先前很感謝gugod大的回覆 這次的問題是如何清除整個雜湊使Perl釋放記憶體給OS, 程式流程大略為: 在迴圈裡面讀檔進雜湊, 將雜湊內每筆資料分類後輸出資料至硬碟, fork些子程序計算數據 程式如下: foreach my $FH (($FH_1, $FH_2...)) { my (%Data_1, %Data_2, %Data_3); 讀$FH, 分類至各個雜湊... 輸出至硬碟... } fork一堆子程序... 在結束讀檔迴圈後, 迴圈內的三個%Data都還存在, 原先以為fork後父程序的所有變數會完 全複製一份給子程序使記憶體爆掉(但發現其實子程序會透過COW機制先共用父程序的變數?) , 於是開始嘗試將前面的雜湊清空以釋放可用的記憶體, 但不管我怎麼試都無法釋放先前雜湊 所使用到的記憶體... 在ClearHash_Test.pl的測試中發現簡單的值(直接以數字或文字賦值)能透過undef()刪除且 釋放一部份記憶體, 而複雜的值卻無法被直接刪除 , 從Dump_Result可看到Perl在賦值使用到純量變數時會觸發COW機制, 但讓我不懂的是為何 $Hash{'3'}無法透過undef()刪除, 它不是已經跟$Str是不同東西了嗎? OS:Ubuntu 18.04.6, Perl_Ver:5.26.1 ClearHash_Test.pl: use strict; use warnings; use Devel::Peek; my $Str = 'AAAAAAAAAA' x 10000000; #Before exe, Mem:1.55G #After exe, Mem:1.74G, $Str: ~=0.19G my %Hash; $Hash{'1'} = 'AAAAAAAAAA' x 10000000; #Before exe, Mem:1.55G #After exe, Mem:1.93G, $Hash{'1'} = 'AAAAAAAAAA' x 10000000: ~=0.19G $Hash{'2'} = $Str; #Before exe, Mem:1.55G #After exe, Mem:1.93G, $Hash{'2'} = $Str:0G $Hash{'3'} = $Str . '123132'; #Before exe, Mem:1.55G #After exe, Mem:2.12G, $Hash{'3'} = $Str . '123132': ~=0.19G Dump(%Hash); Dump($Str); undef(%Hash); #Before exe, Mem:1.55G #After exe, Mem:1.93G, Hash{'3'}的值還留在記憶體 undef($Str); #Before exe, Mem:1.55G #After exe, Mem:1.84G sleep(10000); Dump_Result(為方便顯示$Str已縮短): %Hash: SV = PVHV(0x561b3d6b1f70) at 0x561b3d6c9a80 REFCNT = 1 FLAGS = (SHAREKEYS) ARRAY = 0x561b3d6efa90 (0:5, 1:3) hash quality = 150.0% KEYS = 3 FILL = 3 MAX = 7 Elt "1" HASH = 0xe77f895 SV = PV(0x561b3d6aae60) at 0x561b3d6aa1e0 REFCNT = 1 FLAGS = (POK,pPOK) PV = 0x561b3d7c4be0 "AAAAAAAAAA"\0 CUR = 10 LEN = 12 Elt "2" HASH = 0x10349798 SV = PV(0x561b3d6aae80) at 0x561b3d6aa3c0 REFCNT = 1 FLAGS = (POK,IsCOW,pPOK) PV = 0x561b3d6ceb40 "AAAAAAAAAA"\0 CUR = 10 LEN = 12 COW_REFCNT = 1 Elt "3" HASH = 0xf299ae6 SV = PV(0x561b3d6aaea0) at 0x561b3d6c90f0 REFCNT = 1 FLAGS = (POK,IsCOW,pPOK) PV = 0x561b3d6d72f0 "AAAAAAAAAA123132"\0 CUR = 16 LEN = 24 COW_REFCNT = 1 $Str: SV = PV(0x561b3d6aada0) at 0x561b3d6c9a38 REFCNT = 1 FLAGS = (POK,IsCOW,pPOK) PV = 0x561b3d6ceb40 "AAAAAAAAAA"\0 CUR = 10 LEN = 12 COW_REFCNT = 1 在這裡我想說會不會是COW_REFCNT阻礙GC機制,所以我在$Hash{$i}的賦值上做一點改變, 但讀檔結束後%Hash依然無法被刪除 Read2Hash.pl: use strict; use warnings; use Devel::Peek; my %Hash; open(my $FH, '<', $ARGV[0]); #檔案約3.4G while (my $Line = <$FH>) { CORE::state $i = 1; $Hash{$i} = $Line . ''; #此處無IsCOW flag, Mem消耗~=4.28G #$Hash{$i} = $Line; #此處有IsCOW flag, Mem消耗~=4.44G $i++; undef($Line); } close($FH); print "done.\n"; <STDIN>; #undef(%Hash); #Dump(%Hash); sleep(10000); 網路上有人說能利用子程序來處理不同部份, 反正子程序正常結束記憶體一定會還給OS, 但 真的拿它們沒辦法嗎? --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.163.195.62 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Perl/M.1729079022.A.900.html







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:iOS站內搜尋

TOP