2011-11-24 78 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

慢速部分究竟是什么?调用脚本的开销?或者脚本实际上能够并行处理多条路径?如果它只是调用开销,也许你可以修改脚本容器,以便逐个处理路径,从而基本上减少到第一个选项(在你的问题中),而没有多个调用的开销? –