2011-11-24 75 views
2

我正在研究monte carol pricer,我需要提高引擎的效率。c中的虛擬內存地址管理#

  • 蒙特卡羅路徑是通過第三方庫(在C++)
  • 定價IronPython中完成(由最終用戶創建的腳本)
  • 一切是由一個C#應用驅動創建

定價過程如下:

  • C#應用程序請求的路徑,並收集他們
  • C#應用程序推路徑劇本,誰的價格和返回值
  • C#應用程序中顯示的結果爲最終用戶

收集被預先知道路徑的數量和規模。

我有2個解決方案的一些優點和缺點:

  1. 請求路徑生成,每個路徑,要求腳本返回結果和finaaly一次聚集所有路徑都處理
  2. 請求路徑的結果生成,收集所有的人,要求該腳本一次處理所有這些,retrun我的最終價格

第一個解決方案很好地工作在所有情況下,但由於路徑的數量要求的增加業績增減e(我認爲這是由於多次調用ironpython)

第二個解決方案更快,但如果請求的路徑數量是「超出內存」異常(我認爲它沒有足夠的虛擬內存尋址空間)太大

我選擇中間地帶,並處理一堆路徑,然後彙總價格。 我現在想要的是通過提前瞭解有多少路徑可以通過處理「內存不足」異常來提高性能。

我做了數學計算,並且事先知道內存中的大小給定請求的路徑。但是因爲我安靜肯定它不是一個記憶的問題,但更多的虛擬內存尋址問題


所以這一切的文字是由以下2個問題總結:

  1. 是否有可能提前知道我的 進程有多少虛擬內存地址需要存儲一個類的實例(大小在內存和結構已知)?
  2. 是否有可能知道多少虛擬內存地址仍然可以繼續我的過程

順便說一句,我工作的32位計算機上

在此先感謝您的幫助

+0

生產者/消費者...線程? – Guillaume

+0

任何原因不只是得到一個64位計算機,並超過4gb ram最大?無論如何,Siovled問題併爲您提供更好的可擴展性。 – TomTom

+0

@Tomtom:不能那樣做,我沒有對目標環境的控制。它可能是64位或32位 – Guillaume

回答

1

找出一個對象在.NET中佔用多少內存是一項相當困難的任務。我幾次遇到同樣的問題。有一些不完美的方法,但沒有一個是非常精確的。

我的建議是對路徑需要多少進行估計,然後通過一堆路徑留下一個良好的安全邊界。即使你一次只處理10個,你已經將開銷減少了10倍。

你甚至可以使邊緣可配置,然後調整它,直到你達到一個良好的平衡。一個更優雅的解決方案是在另一個進程中運行整個事件,如果它遇到OutOfMemoryException,則重新啓動具有較少項目的計算(並相應地調整邊距)。但是,如果數據太多以至於內存不足,則將其傳遞到兩個進程(這也會複製數據)可能會有點慢。

難道內存溢出是由於路徑處理器的一些不完善?內存泄漏也許?這些都可以在C++和.NET中使用。

+0

對於其他流程解決方案,我不是說我正在談論100,000條路徑。這樣做anthore過程找到平衡就是慢。 – Guillaume

+0

通過推斷路徑數量來找到正確的平衡是我所做的,但問題是路徑對象的複雜性取決於用戶請求(事先不知道),但在運行時知道 – Guillaume

+0

慢速部分究竟是什麼?調用腳本的開銷?或者腳本實際上能夠並行處理多條路徑?如果它只是調用開銷,也許你可以修改腳本容器,以便逐個處理路徑,從而基本上減少到第一個選項(在你的問題中),而沒有多個調用的開銷? –