看板 Perl 關於我們 聯絡資訊
我使用perl約也有兩年了 但最近有個問題十分不解 是關於使用my 與區域變數記憶體釋放 我的程式碼如下 =================================== 14 @aChr = (1 .. 25); 15 16 for my $curChr (@aChr){ 17 my @aRead = (); 18 my @aBeg = (); 19 my @aEnd = (); 20 my @aPNC = (); 21 22 getAllReads($curChr, \@aRead); #@aRead 每iter會讀1GB的檔案 23 # 因此@aRead 約 5GB 24 calculateAccumulation(\@aRead, "b", \@aBeg); #造出 @aBeg 約 1 GB 25 calculateAccumulation(\@aRead, "e", \@aEnd); #造出 @aEnd 約 1 GB 26 27 calculatePNC(\@aBeg, \@aEnd, \@aPNC); #造出 @aPNC 約 2 GB 28 outputPNC($curChr, \@aPNC); #將 @aPNC 的內容寫出檔案 29 30 } =================================== 我使用的hp工作站有 48GB 的 Memory 我以為17~20行的陣列皆為 for迴圈內的區域變數,因此每個 iteration 後會釋放記憶體 但執行後發現這個script在跑幾個迴圈之後,把48G的記憶體全部用完了, 進入了無盡的mem swap 我孤狗了my的用法,也爬了文, 得到的答案似乎都符合我原先的認知 (my宣告的變數 scope 在 block 內) 但執行後記憶體用完又是鐵一般的事實。 求救各位高手,問題出在哪,怎樣寫才對呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.109.73.179
AlanSung:試看看改用 state 04/28 15:05
AlanSung: use feature 'state'; 04/28 15:06
CindyLinz:你檢查一下有沒有出現這篇所說的現象 #1B30XYbN (Perl) 04/28 15:07
Pumbaa:請問樓上 1B30XYbN (Perl) 是在哪找? 04/28 15:51
Pumbaa:請問一二樓 state 不是用來宣告 persistant private var 嗎 04/28 15:57
Pumbaa:如此一來如何會達到釋放記憶體的效果呢? 04/28 15:57
AlanSung:是沒釋放,不過也許不會浪費更多? 04/28 16:37
AlanSung:btw, undef @xxxx; 順便也加上去吧 04/28 16:46
AlanSung:上面那行和用 state 與否無關 04/28 16:47
CindyLinz:就在文章列表按 #1B30XYbN 04/28 17:09
mantour:直接把 `#1B30XYbN' 複製在文章列表貼上 04/28 17:09
mantour:記得不要漏掉 `#' 04/28 17:09
Pumbaa:問題已解決,晚點po心得文 感謝各位高手 m(_ _)m 04/28 18:29