【问题标题】:Efficient way to store big data in Python (genome wide analysis)在 Python 中存储大数据的有效方法(全基因组分析)
【发布时间】:2016-12-07 06:58:52
【问题描述】:

我目前正在尝试进行全基因组分析,我真的想知道我是否使用了正确的结构格式。我在网上找不到关于如何以及在何处存储数据以提高效率的真实信息。

在这种情况下,数据是这样组织的:

一个文件 (.ped) = 一个染色体

一条染色体 = 3000 行

一行 = 一个个体,其标识后跟其基因型(超过 100 000 个字符)。

整个文件超过 1,2 围棋。我用pickle来加载它。

我尝试了不同的数据存储方式,例如,如果我将数据全部放在一个列表中,只需 30 秒即可存储 4 个文件中的数据:

pedFile = [
[['G01231GHS', 'G01231GHS', 0, 0, 1, 1], 'ATTTCTC', 'TGTCT00CTGA'],
[['G01324GHS', 'G01324GHS', 0, 0, 1, 1], 'ATT0TAG', 'TGCT000ATGA']
]

第一个字符串是分析的第一个染色体,等等。

index_chr = {'chr2':1, 'chr5':2, 'chr13':3, 'chr16':4}

我也试过这种结构:

pedDico = {
'G01231GHS': {'id':['G01231GHS', 'G01231GHS', 0, 0, 1, 1], 'chr2': 'ATT0CTC', 'chr5': 'TGTCT00CTGA'},
'G01324GHS': {'id':['G01324GHS', 'G01324GHS', 0, 0, 1, 1], 'chr2':'ATT0TAG', 'chr5': 'TGCT000ATGA'}
}

但是上面的结构似乎没有一个更有效。

问题在于需要过滤数据,这意味着使用 for 循环来比较个体之间的数据,这意味着运行需要数小时。我也尝试了一个 numpy 数组,但是构建时间太长了。

你能想出一个更智能的结构吗?尝试使用列表、字典或 numpy 数组来处理此类大数据时,我是不是搞错了?

【问题讨论】:

  • 我建议查看 hdf5 以获取此类数据。它压缩得很好,检索时间很快。看看 PyTables 或 h5py(C 到 Python 的映射)

标签: python performance numpy


【解决方案1】:

我想你想要shelve。它会腌制您的字典,但一次只能取消腌制一个条目。

import shelve
db=shelve.open(filename,writeback=True)
db.update(pedDico)
db.close()

以后想用的时候

import shelve
db=shelve.open(filename)
for dbKey in list(db.keys()):
    data=db[dbKey]  #only unpickle this dictionary entry
    #Do stuff with data
    db.sync() #clear db[dbkey] out of memory and move on

这样您就不必一直在内存中加载和加载大型数据库。

【讨论】:

    【解决方案2】:

    基因组测序是一项繁重的计算任务,正如所描述的那样,存在大量数据。也许 python 不是正确的工具。 看看它的一些 GPU 加速方式,例如 BarraCUDA (http://seqbarracuda.sourceforge.net/index.html)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-21
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      • 2016-06-29
      • 1970-01-01
      相关资源
      最近更新 更多