【问题标题】:Best C# collection for hierarchical data storage用于分层数据存储的最佳 C# 集合
【发布时间】:2014-08-28 06:02:56
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 为什么不创建一个对象层次结构,其中一个封装另一个?
  • 你能澄清一下你的建议吗?
  • 看看Wintellect.Powercollections。 BigList 好像很适合你
  • 人类在哪个宇宙有24条染色体?
  • 如果你要ChromosomeStrandRegion:你为什么想出List&lt;List&lt;List&lt;Region&gt;&gt;&gt;。这看起来不是一个很好的模型。

标签: c# collections containers bigdata hierarchical-data


【解决方案1】:

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

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

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

【讨论】:

  • 这个模型就像 Mare 提到的那个......我仍然没有看到 List of Lists 和这个模型之间的区别。谢谢你建议并发集合,我想我应该先有我的模型;-)
【解决方案2】:

从您的示例可以推断出您需要的最小单位是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 亿个数据集(此处建议的大小)时通常没有问题, 并且您可以将数据库分布在多台计算机上以提高计算速度。

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

【讨论】:

  • 嗯,你的模型对我来说似乎只是一个列表列表。您的基因组是染色体列表,其中每个染色体又是另一个区域列表......所以我不明白为什么这个模型会比列表列表更好。
  • 关于数据库,同意,我们的数据以 TB 为单位,并且都存储在数据库中,集群以分布式方式对其进行处理。但问题在于您需要的查询类型,它别无选择,只能将必要的数据全部加载到这种数据结构中的内存中以运行查询。
  • 有时无法将千兆字节加载到内存中,但仍然可以在千兆字节大小的文本文件中进行搜索。也许这是你要走的路。也许您可以提供更多关于您的查询需求是如何形成的信息,数据结构可以针对任何已知需求进行建模。
  • 让我澄清一下。在实践中,我有List&lt;List&lt;IndexedStrand&gt;&gt;。 IndexedStrand 类以压缩方式索引 chrN-strandM 上的所有数百万个区域。在几毫秒内运行查询,例如“查找周围具有最浓缩 ChIP-seq 峰的区域”。 IndexedStrand 最适合我们的需求,但问题是我们正在寻找更好的替代 List&lt;List&lt;IndexedStrand&gt;&gt;
  • 引入模型中的信息。 List of Lists 几乎没有关于所表达内容的信息。如果您发现有一些对您需要的信号的查询,请将您的模型朝那个方向移动。考虑一下这些数据的分布以及大型集群上的内存数据库。我认为它们将最适合您的需求。有了表现力模型,现在可以针对区域进行优化,而不是针对 List
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
相关资源
最近更新 更多