2012-12-18 80 views
0

我在有一個函數如下兩行C#類的一些IronPython的代碼:爲什麼多次執行IronPython代碼會導致OutOfMemoryException?

void test(MyType request){ 
    compiledCode.DefaultScope.SetVarialbe("target", request); 
    compiledCode.Execute(); 
} 

我在寫一些代碼來進行壓力測試這一/性能測試。我要通過的請求對象是List<MyType>,其中有一百萬MyType's。所以我遍歷這個列表:

foreach(MyType thing in myThings){ 
    test(thing); 
} 

而且工作正常 - 運行約6秒。當我運行時

for(int x = 0; x < 1000; x++){ 
    foreach(MyType thing in myThings){ 
     test(thing); 
    } 
} 

在循環的第19次迭代中,我得到一個OutOfMemoryException

我想這樣做,而不是Python.CreateEngine(AppDomain.CurrentDomain),這似乎沒有任何效果,我試圖

... 
compiledCode.Execute(); 
compiledCode.DefaultScope.RemoveVariable("target"); 

希望以某種方式IronPython的是保持圍繞參考。這花了大約兩倍的時間,但它仍然在同一時間爆炸。

爲什麼我的代碼導致內存泄漏,我該如何解決?

+0

您正在使用哪種IronPython版本?是編譯代碼創建/編譯一次,然後重用? python腳本內部會發生什麼(例如,數據可以以與目標變量不同的方式添加到作用域中)?你有沒有試過用內存分析器來查看它? –

+0

AFAIK它是最新版本。我現在不在工作,所以我無法檢查。哦。哇。是的,這可能會這樣做... –

回答

0

所以,事實證明我根本沒有想到在所有

目標對象包含一個StringBuilder,我正在添加行。每次迭代大約10行,顯然我可以在內存耗盡之前在StringBuilder中保存大約1.9億行文本;)

1

IronPython有一個內存泄漏某處,可以防止對象獲取GC'd。 (讓這是一個教訓,孩子們:託管語言不能解決內存問題,他們只有不同的。)我一直無法弄清楚在哪裏。

你可能會create an issue並附上一個獨立的複製,但更好的辦法是運行你的應用程序對內存分析器,看看什麼是你的MyType對象。

+0

「好」知道...;)如果有一個repro /問題,我會願意附加一個分析器...但我不排除另一個原因這些對象在沒有更多信息的情況下保持活着 –

相關問題