大数据集(>;19000行)上的Python All与All比率比较持续崩溃

大数据集(>;19000行)上的Python All与All比率比较持续崩溃,python,algorithm,optimization,bigdata,bioinformatics,Python,Algorithm,Optimization,Bigdata,Bioinformatics,我已经做了一些关于基因表达和药物相互作用的研究一段时间了,最近我被要求对整个人类基因组进行分析(>19000行)。基本上,我的程序所做的是获取所有表达数据的比率,并将其与一些药物信息(文件的最后9行)关联起来 发生的事情是,每次我运行代码时,我的计算机都会崩溃。有没有什么明显的方法可以让它不必在一台全新的机器上运行?我在远程工作,所以现在不太可能。我正在终端上使用相对较新的MacBookPro运行python。我的代码在下面,如果有什么需要清除,请告诉我。谢谢你的帮助 编辑1:一位同事提到使用A

我已经做了一些关于基因表达和药物相互作用的研究一段时间了,最近我被要求对整个人类基因组进行分析(>19000行)。基本上,我的程序所做的是获取所有表达数据的比率,并将其与一些药物信息(文件的最后9行)关联起来

发生的事情是,每次我运行代码时,我的计算机都会崩溃。有没有什么明显的方法可以让它不必在一台全新的机器上运行?我在远程工作,所以现在不太可能。我正在终端上使用相对较新的MacBookPro运行python。我的代码在下面,如果有什么需要清除,请告诉我。谢谢你的帮助

编辑1:一位同事提到使用AmazonWeb服务来运行这个。这听起来是一个可行的选择吗?从目前为止我所看到的情况来看,仅仅运行这个Python脚本的设置似乎有点复杂

编辑2:下面是一些输入文件的示例:1970个基因的行继续向下,57个不同细胞系的列继续向下

              WT     Mut    Mut     Mut
              WT     Mut    Mut     Mut
Cell lines  BR:MCF7 BR:MDA_MB_231   BR:HS578T
            BR:MCF7 BR:MDA_MB_231   BR:HS578T
5-HT3C2     -0.27   0.99    0.7 -0.42
A1BG-AS1    1.36    -0.15   0.87    1.7
A1CF        -0.14   -0.18   0.15    -0.1
A2LD1       0.62    -0.59   -0.29   2.45
A2M        -0.38    -0.4    -0.24   -0.39
A2ML1       -0.11   -0.13   -0.13   -0.12
A2MP1       0.31    0.65    1.2 0.03
A4GALT      1.99    0.41    -0.75   0.19
A4GNT       0.28    0.08    1.08    0.74
AAA1        -0.27   -0.25   -0.19   -0.16
AAAS        1.16    -1.46   -2.06   -1
AACS        0.73    0.11    -1.11   -2.08
代码

import csv
import numpy
from scipy.stats.stats import pearsonr

Reader = csv.reader(open('/Users/_57_genes.csv', 'rU'))

fout = "/Users/ratio_correlations_whole_genome_6232014.csv"

fileout = open(fout, 'w') #open file

#Create lists of lists including averages
Label = []
Resistance = []


for row in Reader:
    if len(row) == 0 or row[0] == '':
        continue
    else:
        Resistance.append(map(float, row[2:]))
        Label.append(row[0])



Ratios = []
Name = []

for index, i in enumerate(Resistance[0:-9]):
    gene = []
    Name1 = []
    for index2, j in enumerate(Resistance[0:-9]):
        r = []
        if j == i:
             continue
        for k in range(len(i)):
            if j[k] == 0:
                fraction = 0
            else:
                fraction = (i[k]/j[k])
            r.append(fraction)
        Name1.append('%s VS %s' %(Label[index], Label[index2]) )
        gene.append(r)
    Ratios.append(gene)
    Name.append(Name1)



for index, i in enumerate(Ratios):
    GeneName = Name[index]
    for index2, k in enumerate(i):
        Comparitor = GeneName[index2]
        #print k
        fileout.write('%s, ' % (Comparitor))
        for avg in (Resistance[-9:]):
            correlate = pearsonr(k, avg)
            fileout.write('%0.6f, %0.6f, ' % correlate)
        fileout.write('\n')

fileout.close()

如果你能解释一下什么才是真正的
i
,一个
j
。您似乎没有在这段代码上使用
m

您还可以让文件在整个过程中保持打开状态,而不是在完成读取后关闭文件。并且在您真正需要它之前,打开输出文件(也可以考虑将结果追加到文件中)。虽然我不熟悉,但如果内存有问题,可以使用生成器而不是迭代器。数据结构的另一个考虑因素是代码可以是文件。你能把输入文件的几行写出来吗


“崩溃”消息是什么?

要帮助排除故障,请在运行程序时查看OSX中的
活动监视器,尤其是在内存消耗选项卡上。
您可以观察python进程及其使用的内存,并查看总可用内存

正如一些帖子所暗示的,您可能有内存问题。 生成器将简化处理并节省时间/内存

(我在这里假设采用64位体系结构;如此大的数据的32位代码在内存耗尽之前会耗尽地址空间……我已经使用pypi提供的
pympler
模块测量了对象的大小。)

您正在构建两个二维阵列,其中包含19000*19888=360981000项。名称数组本身包含那么多字符串。Python中的每个字符串对象至少需要40个字节,另外还需要为对象指针添加至少8个字节……这意味着该数组至少需要13GB

另一个数组更有趣:另一个数组每项至少占用112字节(至少一个双精度数组的列表占用104字节,一个指针占用8字节),这是另一个37GB

你的电脑有50GB的内存吗?如果没有,您需要认真地重新思考您的代码。您真的需要同时存储所有值吗?也许您可以使用另一种算法,它不是从表中获取值,而是仅在需要时(实际需要时)计算所需的值

也许您可以使用
numpy
数组来代替python列表,因为数组在内存中的效率要高得多(对于双倍数组,每项8字节,而不是32字节)

如果你可以从他们的报价中购买最昂贵的AWS机器,那么购买AWS机器似乎是一个快速的解决方案。请注意,确切的内存需求将更大,这取决于字符串长度、python列表的实现细节(他们使用的指数缩放算法会增加额外的开销,以使列表快速调整大小),等等


此外,还有一条与算法无关的注释。从统计角度来看,计算360981000个p值几乎没有意义。请记住,为了使该程序在科学上有效,您很可能需要对p值应用多重测试校正。有这么多的p值,校正将是巨大的,可能会使您从程序中获得的任何见解无效(例如,要获得0.05调整后的p值,您需要观察低于0.0000000002的未调整p值)。

19000行大吗?我不这么认为!在enumerate(Resistance[0:-9]):
行及之后,index2,j的语法格式是否正确?这看起来像是应该缩进。很抱歉,粘贴代码时出现错误,应该立即修复。代码的工作原理与我以前在较小的数据集(大约80-100行)上多次使用的代码相同。输出非常大,因为我计算的是每组基因表达式之间的比率,因此它将大于19000^2。请看Name和Name1。您试图在这些列表中存储大量条目(~10^8)—是否检查了内存是否已用完?您可能需要考虑一种解决方案,它不需要存储所有对的信息。相反,你可能需要计算每一对的所有必需统计数据,并在一个步骤中写出它们。嗨,这里是i和j,基因表达值大约在-5到+5之间。文件的最后9行是相似的,但它们是一组药物的所谓敏感性数据,这就是我将比率与之关联的数据。你说得对,我不使用“我在这里”(已删除)。我没有收到崩溃消息,终端和我的整个机器都挂断了。如果我让它运行一周,它就可以完成脚本,但我不确定这是不是真的。