BinomTest

最近在做甲基化数据的分析,要对每个甲基化的位点进行二项分布检验,在R中串行实在是太慢了,总共4千万行的数据跑4天都没跑完,于是写了一个多进程的python脚本,程序主要涉及到大量的CPU计算,而多线程适合IO读写比较多的场景,多线程由于GIL的限制我没有用

job 函数

对传入的数据进行二项分布测验,基于scipy包中的stats模块

def BioTest(TestData):
  output = []
  for line in range(0, len(TestData)):
    TestData[line] = TestData[line].strip("\n").split("\t")
    count = int(TestData[line][2])+int(TestData[line][3])
    p_value = stats.binom.pmf(int(TestData[line][2]), count, 0.006)
    TestData[line].append(p_value)
    if p_value < 1e-5:
      output.append(TestData[line])
  return output

pool连接池

  • 在for循环中对数据进行切片

  • 使用p.apply_async定义任务

  • 在for循环外,开始多线程

  • pool.join阻塞主线程运行

  • pool运行的结果可以直接返回给主线程

脚本在数据输出时存在内存溢出的问题

原因就是每个线程都把数据存在output列表里,导致list存的数据太大了

解决内存溢出的问题

  • callback回调函数进行解决

  • 加上文件锁

Last updated

Was this helpful?