Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.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#_Performance_Arrays - Fatal编程技术网

C# C中超大数组(内存方面)的推荐类型#

C# C中超大数组(内存方面)的推荐类型#,c#,performance,arrays,C#,Performance,Arrays,我有一个大数组,里面有大约20k个对象。每个对象都有一个大而复杂的树结构中的子对象,其中也有数组。目前,该应用程序仅使用一个简单的myObjectType[]myArray开发,只需13秒即可获得数组中的项目数 是否有更好的类型或更好的方法来管理阵列?99%的阵列使用率是从中读取的,但目前填充它几乎需要3分钟 编辑::添加更多信息 该应用程序目前正在将所有这些数据加载到巨型阵列中,然后将该阵列用作数据库。然后,它根据您从一些下拉框中的选择向下过滤数据,并将子集返回到要显示的数据网格。我没有选择重

我有一个大数组,里面有大约20k个对象。每个对象都有一个大而复杂的树结构中的子对象,其中也有数组。目前,该应用程序仅使用一个简单的
myObjectType[]myArray
开发,只需13秒即可获得数组中的项目数

是否有更好的类型或更好的方法来管理阵列?99%的阵列使用率是从中读取的,但目前填充它几乎需要3分钟

编辑::添加更多信息

该应用程序目前正在将所有这些数据加载到巨型阵列中,然后将该阵列用作数据库。然后,它根据您从一些下拉框中的选择向下过滤数据,并将子集返回到要显示的数据网格。我没有选择重写整个事情,只是把过滤器传递给实际的数据库

编辑:更多信息,抱歉延误,已被拉入会议

[Serializable]
public class PartsList : System.Collections.CollectionBase
{
  public virtual Part[] parts {get { return (Part[])List; } }
  public new virtual int Count { get{ return this.List.Count;}}

  public virtual CountryList GetCountries()
  {
    CountryList countries = new CountryList;
    //Code removed - goes through every sub item and makes a list of unique countries... 
    // Yes, could have been done better. 
    Return countries;
  }

}
/////////////////////////////////////

[Serializable]
public class Part
{
  private int id, blah, myvariable;
  private CountryList countries;  //formatted the same way as this class...
  private YearList  years; 
  private ModelList models;
  private PriceHistoryList priceHistoryList;
  // there are a couple more like these...
}
这就是为什么装载需要3分钟。 -20k件 -每部分1-2个国家 -每个零件1-10年 -每个零件1-12个型号 -每个零件1-10个价格历史记录

当我停止此行上的调试器时: PartsList mylist=新PartsList; //在此处填充列表 如果(list.Count!=0)20000个对象(例如实际上的引用)是微不足道的。计数将立即返回。如果您遇到问题,那不是因为数组类

最终使用哪一个集合取决于您要对其执行的操作

在优化之前,始终确保找到瓶颈。通常情况下,这并不是人们首先期望的,因此您绝对应该使用探查器来查看实际占用这么多时间的内容。

20000个对象(例如,实际上的引用)是微不足道的。计数将立即返回。如果您遇到问题,那不是因为数组类

最终使用哪一个集合取决于您要对其执行的操作


在优化之前,始终确保找到瓶颈。通常情况下,这并不是人们首先期望的,因此您绝对应该使用探查器来查看实际占用这么多时间的内容。

您可以使用类似于
字典的东西,并使用适当的键进行快速查找。但是,您是如何进行计数的?使用Count()方法可能很慢,但长度应该很快

根据相关新信息更新

大家都知道CollectionBase有点慢,因为所有的东西都是作为一个对象存储的,铸造操作到处都是,就像热上的蚂蚁一样。如果您将VS2003与.NET1.1一起使用,那么您可能会被困在试图通过优化方法摆脱糟糕局面的困境中。如果您可以在.NET2.0中使用VS2005,那么您可以使用泛型集合,它(a)在管理新类型的集合时占用了所有的管理员,并且(b)速度更快

这些问题可能会引起兴趣:


您可以使用类似于
字典的东西,并使用适当的键进行快速查找。但是,您是如何进行计数的?使用Count()方法可能很慢,但长度应该很快

根据相关新信息更新

大家都知道CollectionBase有点慢,因为所有的东西都是作为一个对象存储的,铸造操作到处都是,就像热上的蚂蚁一样。如果您将VS2003与.NET1.1一起使用,那么您可能会被困在试图通过优化方法摆脱糟糕局面的困境中。如果您可以在.NET2.0中使用VS2005,那么您可以使用泛型集合,它(a)在管理新类型的集合时占用了所有的管理员,并且(b)速度更快

这些问题可能会引起兴趣:


    • 当然,这取决于您的使用情况。我最近优化了一些代码,加载时间从2-3分钟缩短到1.5秒。也许你可以从我的博客中得到一些想法:


      这主要是因为摆脱了我糟糕的singleton实例,并使用IoC容器为我完成了这项工作

      当然,这取决于你的使用情况。我最近优化了一些代码,加载时间从2-3分钟缩短到1.5秒。也许你可以从我的博客中得到一些想法:


      这主要是因为摆脱了我糟糕的singleton实例,并使用IoC容器为我完成了这项工作

      任何.NET托管应用程序中的数组类型
      T[]
      将数组的长度作为变量存储在对象开头附近。获取计数只需要很少的时间,因此我们需要更多关于完整结构的信息(特别是您所说的“计数”)来告诉您花费了这么长的时间


      一个建议是将“节点X下的子项总数”存储为节点的一部分。这需要O(logn)时间来维护,这与影响计数的树操作的复杂性相同,因此不会影响结构的算法复杂性(尽管它会向每个节点添加一个4字节的变量)。

      数组类型
      T[]
      在任何.NET托管应用程序中,数组的长度作为变量存储在对象开头附近。获取计数只需要很少的时间,因此我们需要更多关于完整结构的信息(特别是您所说的“计数”)来告诉您花费了这么长的时间


      一个建议是将“节点X下的子项总数”存储为节点的一部分。这需要O(logn)时间来维护,这与影响计数的树操作的复杂性相同,因此不会影响结构的算法复杂性(尽管它确实为每个节点添加了一个4字节的变量)。

      它如此缓慢只有一个原因。这是一个被称为打击的老式问题。当你的程序运行时,注意你的硬盘。它在疯狂地眨眼吗?购买更多的R