2010-08-05 129 views
21

有沒有任何方法可以剖析mathkernel內存使用情況(下降到各個變量),而不是爲他們的Eclipse插件(mathematica workbench,iirc)支付$$$?在Mathematica中剖析內存使用情況

現在我完成了一個需要多個GB內存的程序的執行,但唯一存儲的內容至多應該是〜50MB的數據,然而mathkernel.exe傾向於保持在〜1.5GB(基本上就像Windows一樣)。有沒有更好的方法來解決這個問題,除了保存我需要的數據並每次退出內核?編輯:我剛剛瞭解到ByteCount函數(它顯示基本數據類型的一些令人不安的結果,但除此之外),但即使是我所有變量的總和遠遠不是mathkernel所用的數量。是什麼賦予了?

回答

12

有一件事很多用戶都沒有意識到,無論您是否將輸出分配給變量,都需要內存將所有輸入和輸出存儲在InOut符號中。 Out也被別名爲%,其中%是之前的輸出,%%是倒數第二等%123相當於Out[123]

如果你沒有使用%的習慣,或者只是用它來深幾級,設置$HistoryLength爲0或小的正整數,只保留最後幾個(或沒有)輸出的Out各地。

您可能還想看看功能MaxMemoryUsedMemoryInUse

當然,$HistoryLength問題可能或不是你的問題,但你沒有分享你的實際評估是什麼。 如果你能夠發佈它,也許有人能夠更清楚地瞭解爲什麼它需要大量的內存。

4

邁克爾皮拉特的answer是一個很好的,MemoryInUseMaxMemoryUsed可能是你有最好的工具。 ByteCount很少有幫助,因爲它測量的結果可能是一個巨大的高估,因爲它忽略了共享的子表達式,並且它經常忽略不能通過Mathematica函數直接訪問的內存,而Mathematica函數通常是內存使用的主要組件。

您可以在某些情況下執行的一件事是使用Share函數,該函數強制在可能的情況下共享子表達式。在某些情況下,這可以爲您節省數十甚至數百兆字節。在使用Share之前和之後,您可以通過使用MemoryInUse來了解它的工作情況。

此外,一些無傷大雅的東西可能會導致Mathematica使用比預期更多的內存。機器實體的連續陣列(和只有機器實體)可以被分配爲所謂的「打包」陣列,這些陣列很可能被C或Fortran分配。但是,如果數組中包含機器實數和其他結構(包括符號),則所有內容都必須爲"boxed",並且該數組將成爲指針數組,這會增加大量開銷。

2

一種方法是在內存不足時自動重啓內核。您可以在從內核中執行耗費內存的代碼,而主內核僅執行計算結果並控制內存使用情況。

+0

@Alexy,你可以指向一個示例代碼/演示? – 2014-07-12 00:14:22

+0

@myaccount_ram示例:http://stackoverflow.com/a/5017071/590388 – 2014-07-12 03:15:24

7

這裏是我的內存使用情況的分析解決方案:

myByteCount[symbolName_String] := 
    Replace[ToHeldExpression[symbolName], 
    Hold[x__] :> 
    If[MemberQ[Attributes[x], Protected | ReadProtected], 
    Sequence @@ {}, {ByteCount[ 
     Through[{OwnValues, DownValues, UpValues, SubValues, 
      DefaultValues, FormatValues, NValues}[[email protected], 
     Sort -> False]]], symbolName}]]; 

With[{listing = myByteCount /@ Names[]}, 
Labeled[Grid[[email protected][Sort[listing], -100], Frame -> True, 
    Alignment -> Left], 
    Column[{Style[ 
    "ByteCount for symbols without attributes Protected and \ 
ReadProtected in all contexts", 16, FontFamily -> "Times"], 
    Style[[email protected]{"Total: ", Total[listing[[All, 1]]], " bytes for ", 
     Length[listing], " symbols"}, Bold]}, Center, 1.5], Top]] 

評價高於下表給出了:

screenshot

+0

在7.0.1上出現錯誤:'Optional :: opdef:可選參數BoxForm'pat _的默認值:{_,__ }包含一個模式。 >>''但我也得到輸出。你也得到錯誤嗎? – 2011-08-17 06:05:29

+0

@ Mr.Wizard在新鮮的會議中,我沒有得到他們,但經過一番努力,上面的代碼開始產生這些消息。 – 2011-08-17 06:10:07