Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c语言中的虚拟内存地址管理#_C#_Memory Management_Ironpython - Fatal编程技术网

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

C# c语言中的虚拟内存地址管理#,c#,memory-management,ironpython,C#,Memory Management,Ironpython,我正在研究monte carol pricer,我需要提高发动机的效率 MonteCarlo路径由第三方库(在c++中)创建 定价是在IronPython中完成的(由最终用户创建的脚本) 其他一切都是由c#应用程序驱动的 定价过程如下: C#应用程序请求路径并收集它们 C#应用程序将路径推送到脚本,脚本定价并返回值 C#应用程序向最终用户显示结果 收集的路径的数量和大小是预先知道的 我有两种解决方案,有一些优点和缺点: 请求路径生成,对于每个路径,要求脚本返回结果,并在处理完所有路径后最

我正在研究monte carol pricer,我需要提高发动机的效率

  • MonteCarlo路径由第三方库(在c++中)创建
  • 定价是在IronPython中完成的(由最终用户创建的脚本)
  • 其他一切都是由c#应用程序驱动的
定价过程如下:

  • C#应用程序请求路径并收集它们
  • C#应用程序将路径推送到脚本,脚本定价并返回值
  • C#应用程序向最终用户显示结果
收集的路径的数量和大小是预先知道的

我有两种解决方案,有一些优点和缺点:

  • 请求路径生成,对于每个路径,要求脚本返回结果,并在处理完所有路径后最终聚合结果
  • 请求路径生成,收集所有路径,请求脚本一次处理所有路径,并重新运行最终价格
  • 第一种解决方案在所有场景中都可以正常工作,但随着请求的路径数量的增加,性能会下降(我认为这是由于多次调用ironpython造成的)

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

    我选择中间立场,处理一系列路径,然后汇总价格。 我现在想要的是通过提前知道在不出现“内存不足”异常的情况下可以处理多少条路径来进一步提高性能

    我做了计算,并且预先知道给定请求的路径大小(内存中)。然而,因为我确信这不是内存问题,而是虚拟内存寻址问题


    因此,本文通过以下两个问题进行总结:

  • 是否可以提前知道我的虚拟内存地址是多少 进程需要存储一个类的n个实例(内存大小和结构已知)
  • 是否可以知道有多少虚拟内存地址仍然可用于我的进程
  • 顺便说一句,我在32位计算机上工作

    提前感谢您对问题1的帮助


    关于问题2:您可以使用一个

    来确定一个对象在.NET中占用了多少内存,这是一项相当困难的任务。同一个问题我已经碰到好几次了。有一些不完善的方法,但没有一种是非常精确的

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

    你甚至可以让保证金配置,然后调整它,直到你找到一个良好的平衡。一个更优雅的解决方案是在另一个进程中运行整个过程,如果遇到OutOfMemoryException,则使用较少的项重新开始计算(并相应地调整边距)。但是,如果您有太多的数据,以至于内存不足,那么在两个进程之间传递数据可能会有点慢(这也会复制数据)


    内存溢出可能是由于路径处理器中的某些缺陷造成的吗?可能是内存泄漏?在C++和.NET中都是可能的。线程化?有什么理由不让一台64位计算机的内存超过4gb的最大容量?解决了这个问题,并提供了更好的可伸缩性。@Tomtom:不行,我无法控制目标环境。它可以是64位或32位,然后您还可以在其上设置LAA标志。给你3gb而不是2gb。@TomTom:这很好,但坦率地说,如果你去见IT基础架构的负责人,让他改变提供给用户的标准版本,我想他会嘲笑我,因为我说的其他流程解决方案不是一个选项。在另一个过程中找到平衡会变慢。通过外推路径数来找到正确的平衡是我所做的,但问题是路径对象的复杂性取决于用户请求(事先不知道),但在运行时知道到底什么是慢的部分?调用脚本的开销?或者脚本实际上能够并行处理多条路径吗?如果只是调用开销,那么您可以修改脚本容器,使其逐个处理路径,从而基本上减少到第一个选项(在您的问题中),而不需要多次调用的开销?开销是由c调用脚本(c调用IronPytoh)引起的,脚本按顺序处理路径,但问题是我需要调用它的时间。如果我将路径分组10以处理100000个路径,我将调用脚本10000如果我将路径分组100000,我将调用“脚本”(ironpython)一次,从而将开销减少10000。但不管你怎么帮我找到解决办法我在极端条件下做了测试,这是不现实的。有了现实价值,开销就不那么重要了。我将找到标准路径的最佳分组值,并根据用户请求的路径动态调整它