在Python中存储大数据的有效方法(全基因组分析)

时间:2016-12-07 06:58:53

标签: python performance numpy

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

在这种情况下,数据以这种方式组织:

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

一条染色体= 3000行

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

整个文件超过1,2 Go。我用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数组来处理这些大数据时,我是不是错了?

2 个答案:

答案 0 :(得分:0)

我想你想要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

这样您就不必一直将大数据库加载到内存中。

答案 1 :(得分:0)

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