- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
一段时间以来,我一直在研究基因表达和药物相互作用,最近受邀对整个人类基因组(>19000 行)进行分析。本质上,我的程序所做的是获取所有表达数据的比率,并将其与一些药物信息相关联(文件的最后 9 行)。
发生的事情是,每次我运行我的代码时,我的计算机都会崩溃。有什么明显的方法可以使它工作而不必在全新的机器上运行它吗?我正在远程工作,所以目前还不太可能。我正在使用一个相对较新的 macbook pro runnning python 终端。我的代码在下面,让我知道是否需要清理。感谢您的帮助!
编辑 1:一位同事提到使用 Amazon Web Services 来运行它。这听起来像是一个可行的选择吗?根据我目前所见,仅运行此 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()
最佳答案
(我在这里假设一个 64 位架构;如此大的数据的 32 位代码会在用完内存之前用完地址空间……我使用 pympler
模块测量了对象的大小,可从pypi.)
您正在构建两个包含 19000*19888=360981000 项的二维数组。名称数组本身包含那么多字符串。 Python 中的每个字符串对象至少需要 40 个字节,再加上您至少需要为对象指针添加 8 个字节……这意味着这个数组至少需要 13GB。
另一个数组更有趣:另一个数组每个项目至少占用 112 个字节(至少一个 double 的列表占用 104 个字节,指针占用 8 个字节),这又是 37GB。
你的电脑有 50GB 的内存吗?如果不是,您需要认真地重新考虑您的代码。您真的需要同时存储所有值吗?也许您可以改用另一种算法,而不是从表中获取值,而是仅在需要时(实际需要时)计算必要的值?
也许您可以使用 numpy
而不是 python 列表数组,内存效率更高( double 组每项 8 字节,而 32 字节)。
获得 AWS 机器似乎是一个快速的解决方案,前提是您可以支付他们提供的最昂贵的机器。请注意,确切的内存需求会更大——它们取决于字符串长度、python 列表的实现细节(它们使用的指数缩放算法增加了额外的开销以使列表大小调整快速工作)等。
另外,有一点与算法无关。从统计学的角度来看,计算 360981000 个 p 值很少有意义。请记住,要使此过程在科学上有效,您很可能需要对 p 值应用多重检验校正。有了那么多 p 值,校正将是巨大的,并且可能会使您从该过程中获得的任何见解无效(例如,要获得 0.05 调整后的 p 值,您需要观察到低于 0.0000000002 的未调整 p 值)。
关于大数据集(>19000 行)上的 Python All 与 All 比率比较不断崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24378495/
我是一名优秀的程序员,十分优秀!