我的数据具有层次关系。让我们想象一下人类的染色体。我们有24条染色体,每条染色体都是双链的(即+/-),每条链上我们有多个区域。让我们假设不同链和染色体上的区域是独立的。目前我将所有地区存储如下:
List<List<List<Region>>> regions;
第一个列表表示染色体,第二个列表链,第三个列表表示区域。
出于我的处理目的,需要对这些列表进行各种插入/删除以及大量的顺序和随机访问。而且由于可能存在大量区域(数十亿)的速度和内存消耗效率至关重要。人类的染色体数目为24,因此只有2条链:[24 x 2 x 1E + 9]可能是regions
的大小。
regions
是基础,因此我想知道我的数据内存表示是否有更好的解决方案。
答案 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亿个数据集的问题(此处建议的大小), 并且您可以跨多台计算机分发数据库以提高计算速度。
并且,这是最重要的:数据库针对非常大的数据集的随机,顺序访问进行了优化。数据库技术是计算机科学中最成熟的技术之一。