管理非常大的集合的好方法

时间:2015-05-08 17:57:42

标签: c# collections linked-list

我正在尝试一种快速有效的方法来处理大量项目,所有相同的结构类型,其中数组可以随着时间的推移而增长,并在条件合适时快速选择性地删除项目。

应用程序将以相对较快的速度传输大量数据,我需要快速分析它,更新一些UI信息,并删除旧的数据点以便为新的数据点腾出空间。我需要将某些感兴趣的数据点挂在比其他数据更长的时间。

数据有效负载包含2个整数,代表物理频谱数据:频率,功率等。“老化”的东西只是我用来确定什么时候放弃旧时的一些元数据。数据

我认为使用LinkedList是一个不错的选择,因为它可以轻松地从集合中间删除项目,但我需要能够执行以下伪代码:

for(int i = 0; i < myCollection.Length; i++)
{
    myCollection[i].AgeOutVal--;

    if(myCollection[i].AgeOutVal == 0)
    {
       myCollection.Remove(i);
       i--;
    }
}

但我收到编译错误,表明我不能使用这样的集合。什么是好的/快速的方法呢?

1 个答案:

答案 0 :(得分:4)

我建议您首先对程序进行一些严肃的性能分析。每秒处理一百万件商品只会让每件商品花费几千个周期,这当然是可行的。但是,有了这种性能目标,您的性能将受到数据局部性和导致的缓存未命中等因素的严重影响。

其次,我建议您将“需要从队列中移除此事物”的问题与对象本身所代表的任何问题分开。

第三,你没有说“年龄”领域有多大,只是它正在倒计时。每次通过循环改变整个集合只是为了找到要删除的集合似乎效率低下。一些想法:

  • 假设“年龄”从10减少到零。不是创建一个集合而且集合中的每个项目都有一个年龄,创建十个集合,一个用于将在一个中超时的事物,一个用于将在两个中超时的事物,等等。每个勾选你扔掉“超时”的集合,然后“两个超时”集合变成“一次性超时”集合,依此类推。每次通过循环,你只需移动少量的集合引用,而不是改变大量的项目。

  • 为什么“年龄”倒数呢?时间在增加。根据创建时标记每个项目,并且永远不要更改它。使用队列,这样您就可以在一端插入新项目并从另一端删除它们。因此,队列将按年龄排序。每个刻度,出现太旧的物品,直到你找到一个不太旧的物品。如其他地方所述,队列的循环缓冲区实现可能是有效的。