3

我必须使用一个开源项目(biojava),但我对某些性能不满意,我想花一些时间来改进它。

例如,我有一个以这种方式编码的文本数据库:

chrX    Cufflinks   exon    65175856    65175971    .   .   .   gene_id "XLOC_002576"; transcript_id "TCONS_00004217"; exon_number "1"; gene_name "RP6-159A1.2"; oId "CUFF.3698.1"; nearest_ref "ENST00000456392"; class_code "p"; tss_id "TSS3873";    
chrX    Cufflinks   exon    128986006   128986088   .   .   .   gene_id "XLOC_002577"; transcript_id "TCONS_00004218"; exon_number "1"; oId "CUFF.3750.1"; class_code "u"; tss_id "TSS3874";

并非每个字段都是必需的,每个字段都gene_id可能与多个transcript_id(1..n) 相关联,并且每个字段transcript_id都有 1 个或多个exon

库的行为是将整个文本文件加载到 中ArrayList,并且对于每次搜索,必须迭代列表。这适用于小列表,但在我的情况下,我有 10^10 个查询和一个非常大的列表,并且在一台好的计算机上需要几天时间。

Neo4j 会是一个不错的选择吗?什么是实施它的好方法?例如,创建一个纯字符串实体并在它们之间建立关系是不是很糟糕?还是将 Hsqldb 与单个表一起使用更好?

请注意我不需要持久性,但速度和同步是强制性的。

编辑:如果你愿意,你可以看看这里的项目。

4

2 回答 2

0

如果速度很关键,因为您的数据模式看起来“简单”,您可以执行“手动”解决方案。如果开发时间比“绝对速度”更重要,那么内存 RDBMS 是一个不错的选择。如果不需要持久性,我会避免使用 neo4j,因为它更适合持久性,并且您的数据似乎更“关系”而不是“复杂图”

如果速度很关键,并且您不采用 Hsqldb 之类的解决方案,那么我们的想法是填充 3 种对象(基因、转录本、外显子),并使用哈希图对它们进行索引。

于 2012-07-07T10:05:33.367 回答
0

当您想在大海捞针时,Neo4J 工作得很好,即当您有一个大数据集时,但是当您运行查询时,您只对查询少量数据感兴趣。例如,如果您有如下图表:

(gene) -> (transcript) -> (exon)

那么 Neo4J 将擅长运行诸如“从基因 XLOC_002576 开始,给我它的所有转录本并给我所有其他与这些转录本相关的基因”之类的查询。(我不知道什么是转录本和外显子,所以这个查询可能没有意义,但你明白了)。

如果您不是大海捞针,而是为每个查询处理整个数据集,那么 Neo4J 不太可能成为这项工作的工具。如果数据集真的很大(如数百 GB),您是否正在将整个数据集缩减为一个小答案,并且您不介意将处理分布在多台机器上,那么也许使用hadoop map reduce 并上传大文本文件到 HDFS 可能是一种选择。

如果您提供有关查询配置文件的更多信息,这将有助于提供更好的答案。即你对数据做了什么?“搜索”是什么意思?

于 2012-07-18T23:27:11.383 回答