C# - 是记忆中影响本地处理性能的对象的数量



我对我在程序中看到的东西感到非常困惑。

假设我们有两个大对象的列表(从2个外部文件加载)。

然后,我迭代每个对象,对于每个对象,我称之为一个方法,该方法执行一堆处理。

只是为了说明:

    foreach (var object in objects)
    {
        object.DoSomething();
    } 

在第一种情况下,对象包含2个项目。它完成非常快,我单独跟踪每个对象的进度,并且每个对象的处理非常快。

然后我再次运行该程序,这次添加了更多输入文件,所以我不是2个对象。

因此,代码再次运行,并且从之前的两个对象以及更多的对象以及更多的对象,但是出于某些奇怪的原因,现在每个处理(每个调用object.dosomething())需要更长的时间。<<<<<<<<<</p>

  • 假设场景1带有2个对象,objecta.dosomething()占1分钟完成。
  • 假设方案2,带有6个对象,相同的objecta.dosomething()在方案1中,现在需要5分钟才能完成。

我列表中拥有的对象越多,每个对象的每个处理都越长。

那怎么可能?在内存中对象对特定独立对象的单个处理的性能如何受到影响?在上面的方案1和2中,在完全相同的数据上完全相同的处理需要明显不同的时间来完成?

另外,请注意,从一开始,处理速度较慢,它不会在第一个对象上快速启动,然后逐渐减慢,它只是始终如一地与处理的对象数量相称地放慢速度。我在那里有一些多线程,并且可以看到当我开始添加更多对象时,线程完全滴落的速率。多线程发生在" Dosomething()"内部,并且不会使所有线程都完成。但是,我认为这个问题与多线程无关。实际上,我添加了多线程,因为

另外,请注意,最初我将所有输入文件合并到一个巨大的对象中,一个呼叫dosomething(),我将其分解为以为它可以帮助性能。

这是一种"正常"行为,如果是的,那么解决方案是什么?我可以想到处理数据的其他方法,但是我仍然没有得到这种行为,我必须做些什么才能在此处获得预期的结果。

编辑1:上面的"对象"列表中的每个对象还包含一个较小对象的列表(队列),每个对象大约有5000个。我开始相信我的问题可能是,我应该使用结构或类似的东西,而不是拥有那么多嵌套的对象。这会解释我上面描述的行为类型吗?

如评论中所述,我的问题太抽象了,无法给出任何确切的答案。我主要想要一些指针,并且要知道我是否可能遇到了一些内部限制。

事实证明,我忽略了我在内部记录结果并产生报告的单独机制。我非常迅速地建造了该系统的那一部分,它效率低下,而且增长的速度太快了。限制内部结构的大小,限制了大型收藏中的检索量并在较小的块中分解处理。

只是为了说明,现在花费了6个小时以上的东西需要1分钟。对我感到羞耻。清洁剂的解决方案是使用数据库,但至少看来我现在要离开这个数据库。

最新更新