用于分层数据存储的最佳C#集合

时间:2014-08-28 06:02:57

标签: c# collections containers bigdata hierarchical-data

我的数据具有层次关系。让我们想象一下人类的染色体。我们有24条染色体,每条染色体都是双链的(即+/-),每条链上我们有多个区域。让我们假设不同链和染色体上的区域是独立的。目前我将所有地区存储如下:

List<List<List<Region>>> regions; 

第一个列表表示染色体,第二个列表链,第三个列表表示区域。

出于我的处理目的,需要对这些列表进行各种插入/删除以及大量的顺序和随机访问。而且由于可能存在大量区域(数十亿)的速度和内存消耗效率至关重要。人类的染色体数目为24,因此只有2条链:[24 x 2 x 1E + 9]可能是regions的大小。

regions是基础,因此我想知道我的数据内存表示是否有更好的解决方案。

2 个答案:

答案 0 :(得分:1)

我认为最好创建一个自定义对象来保存分层数据。例如:

public class Region
{
    public List<Region> Regions { get; set; } 
    ... other properties, methods, etc
}

正如我所见,你需要使用这些数据进行一些繁重的计算。因此,您可能会尝试使此计算异步,如果是这样,请查看System.Collections.Concurrent命名空间以获取多线程集合。

答案 1 :(得分:1)

从您的示例可以推断出您需要的最小单位是base-pair

所以,我会建模像

public class Genome
{
    public List<Chromosome> Chromosomes {get;set;} // has 23 elements on average
}

public class Chromosome
{
    public List<Region> Regions {get;set;}
}

public class Region
{
    public List<BasePair> BasePairs {get;set;}
}

public class BasePair
{ 
   // some combinations of proteins
}

根据您需要数据的性能,我会用数据库来支持。

数据库通常没有存储30亿个数据集的问题(此处建议的大小), 并且您可以跨多台计算机分发数据库以提高计算速度。

并且,这是最重要的:数据库针对非常大的数据集的随机,顺序访问进行了优化。数据库技术是计算机科学中最成熟的技术之一。