大数据集(>;19000行)上的Python All与All比率比较持续崩溃
我已经做了一些关于基因表达和药物相互作用的研究一段时间了,最近我被要求对整个人类基因组进行分析(>19000行)。基本上,我的程序所做的是获取所有表达数据的比率,并将其与一些药物信息(文件的最后9行)关联起来 发生的事情是,每次我运行代码时,我的计算机都会崩溃。有没有什么明显的方法可以让它不必在一台全新的机器上运行?我在远程工作,所以现在不太可能。我正在终端上使用相对较新的MacBookPro运行python。我的代码在下面,如果有什么需要清除,请告诉我。谢谢你的帮助 编辑1:一位同事提到使用AmazonWeb服务来运行这个。这听起来是一个可行的选择吗?从目前为止我所看到的情况来看,仅仅运行这个Python脚本的设置似乎有点复杂 编辑2:下面是一些输入文件的示例:1970个基因的行继续向下,57个不同细胞系的列继续向下大数据集(>;19000行)上的Python All与All比率比较持续崩溃,python,algorithm,optimization,bigdata,bioinformatics,Python,Algorithm,Optimization,Bigdata,Bioinformatics,我已经做了一些关于基因表达和药物相互作用的研究一段时间了,最近我被要求对整个人类基因组进行分析(>19000行)。基本上,我的程序所做的是获取所有表达数据的比率,并将其与一些药物信息(文件的最后9行)关联起来 发生的事情是,每次我运行代码时,我的计算机都会崩溃。有没有什么明显的方法可以让它不必在一台全新的机器上运行?我在远程工作,所以现在不太可能。我正在终端上使用相对较新的MacBookPro运行python。我的代码在下面,如果有什么需要清除,请告诉我。谢谢你的帮助 编辑1:一位同事提到使用A
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行是相似的,但它们是一组药物的所谓敏感性数据,这就是我将比率与之关联的数据。你说得对,我不使用“我在这里”(已删除)。我没有收到崩溃消息,终端和我的整个机器都挂断了。如果我让它运行一周,它就可以完成脚本,但我不确定这是不是真的。