簡體   English   中英

c#中的虛擬內存地址管理

[英]Virtual memory address management in c#

我正在制作monte carol pricer,我需要提高發動機的效率。

  • MonteCarlo路徑由第三方庫創建(在c ++中)
  • 定價在IronPython中完成(由最終用戶創建的腳本)
  • 其他一切都是由ac#應用程序驅動的

定價過程如下:

  • C#應用程序請求路徑並收集它們
  • C#應用程序推送腳本的路徑,腳本定價並返回值
  • C#應用程序將結果顯示給最終用戶

收集的路徑的數量和大小是事先知道的。

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

  1. 為每個路徑生成請求路徑,請求腳本返回結果,並在處理完所有路徑后將結果聚合在一起
  2. 請求路徑生成,收集所有這些,請求腳本立即處理所有這些並返回最終價格

第一個解決方案在所有情況下都能正常工作,但是隨着請求路徑數量的增加,性能會下降(我認為這是由於多次調用ironpython)

第二個解決方案更快,但如果請求的路徑數太大,可能會遇到“內存不足”異常(我認為虛擬內存尋址空間不夠)

我選擇中間地帶並處理一堆路徑然后匯總價格。 我現在想要的是通過提前知道我可以處理“內存不足”異常可以處理多少路徑來進一步提高性能

我做了數學計算,事先知道給定請求的路徑大小(在內存中)。 但是因為我很確定這不是內存問題,而是更多的虛擬內存尋址問題


因此,所有這些文本都通過以下兩個問題進行總結:

  1. 是否有可能事先知道我的進程需要多少虛擬內存地址來存儲一個類的實例(內存和結構中的大小是已知的)?
  2. 是否可以知道我的進程仍有多少虛擬內存地址可用

順便說一下,我正在研究32位計算機

先謝謝您的幫助

關於問題1: C#/ .NET對象使用多少內存?

關於問題2:您可以使用內存性能計數器

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

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

您甚至可以設置邊距可配置,然后進行調整,直到達到良好的平衡。 更優雅的解決方案是在另一個進程中運行整個事情,如果它遇到OutOfMemoryException,則用較少的項重新開始計算(並相應地調整邊距)。 但是,如果您有太多的數據導致內存不足,那么將它傳遞到兩個進程(這也會復制數據)可能會有點慢。

可能是內存溢出是由於路徑處理器中的一些缺陷? 內存泄漏可能? 這些都可以在C ++和.NET中使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM