c#中的虚拟内存地址管理

时间:2011-11-24 13:16:39

标签: c# memory-management ironpython

我正在制作monte carol pricer,我需要提高发动机的效率。

  • MonteCarlo路径由第三方库(在c ++中)
  • 创建
  • 定价在IronPython(由最终用户创建的脚本)中完成
  • 其他所有内容均由c#应用程序
  • 驱动

定价过程如下:

  • C#应用程序请求路径并收集它们
  • C#应用程序推送脚本的路径,该脚本定价并返回值
  • C#应用程序将结果显示给最终用户

预先知道所收集路径的数量和大小。

我有两个有一些优点和缺点的解决方案:

  1. 请求路径生成,对于每个路径,请求脚本返回结果,并在处理完所有路径后最终聚合结果
  2. 请求路径生成,收集所有这些,请求脚本立即处理所有这些并返回最终价格
  3. 第一个解决方案在所有情况下都能正常工作,但是随着请求的路径数量增加,性能下降(我认为这是由于多次调用ironpython)

    如果请求的路径数太大,第二种解决方案会更快,但可能遇到“内存不足”异常(我认为虚拟内存寻址空间不够)

    我选择中间地带并处理一堆路径然后汇总价格。 我现在想要的是通过提前知道我可以处理“内存不足”异常可以处理的路径来进一步提高性能

    我做了数学计算,事先知道给定请求的路径大小(在内存中)。但是因为我很确定这不是内存问题,而是更多虚拟内存寻址问题


    因此,所有这些文本都通过以下两个问题进行总结:

    1. 是否有可能事先知道我的虚拟内存是多少 进程是否需要存储一个类的实例(内存和结构中的大小是已知的)?
    2. 是否可以知道我的进程仍有多少虚拟内存地址
    3. btw我正在使用32位计算机

      提前感谢您的帮助

2 个答案:

答案 0 :(得分:1)

关于问题1:How much memory does a C#/.NET object use?

关于问题2:您可以使用memory performance counter

答案 1 :(得分:1)

找出一个对象在.NET中占用多少内存是一项非常困难的任务。我几次遇到同样的问题。有一些不完美的方法,但没有一个是非常精确的。

我的建议是估计路径需要多少,然后通过一堆路径,留下一个很好的安全边际。即使你一次只处理10个,你已经将开销减少了10倍。

您甚至可以设置边距可配置,然后进行调整,直到达到良好的平衡。一个更优雅的解决方案是在另一个进程中运行整个事情,如果它遇到OutOfMemoryException,用较少的项重新开始计算(并相应地调整边距)。但是,如果您有太多数据而内存耗尽,那么将它传递到两个进程(这也会复制数据)可能会有点慢。

内存溢出可能是因为路径处理器存在一些不完善之处吗?内存泄漏可能?这些都可以在C ++和.NET中使用。