繁体   English   中英

在Python中并行读取多个文件

[英]Read in parallel multiples files in Python

我有以下代码,该代码读取多个文件并将某些信息或每一行放入MySQL数据库。 但是,此过程很慢。

def extractAF(files_vcf):
...
for infile_name in sorted(files_vcf):
    print infile_name
    ###single files
    vcf_reader = vcf.Reader(open(infile_name, 'r'))
    for record in vcf_reader:
        snp_position='_'.join([record.CHROM, str(record.POS)])
        ref_F = float(record.INFO['DP4'][0])
        ref_R = float(record.INFO['DP4'][1])
        alt_F = float(record.INFO['DP4'][2])
        alt_R = float(record.INFO['DP4'][3])
        AF = (alt_F+alt_R)/(alt_F+alt_R+ref_F+ref_R)
        if not snp_position in snp_dict:
            sql_insert_table = "INSERT INTO snps VALUES ('" + snp_position + "'," + ",".join(list(('0') for _ in range(len(files_vcf)))) + ")"
            cursor = db1.cursor()
            cursor.execute(sql_insert_table)
            db1.commit()
            snp_dict.append(snp_position)
        sql_update = "UPDATE snps SET " + str(z) + "g=" + str(AF) + " WHERE snp_pos='" + snp_position + "'";
        cursor = db1.cursor()
        cursor.execute(sql_update)
        db1.commit()
    z+=1
return snp_dict

如何同时读取多个文件以加快程序运行速度?

首先,您可以查看哪些行比较慢,还有一个不错的python line_profiler可以检查。 然后,也许您可​​以考虑将函数分成两部分,一个用于并行读取文件,另一个将所有信息批量存储到数据库中。

干杯

一个建议,假设每个文件不是很大的文件。

db1.commit()

for loop之外。 这意味着它必须在for loop结束时执行。

然后,如果要读取文件parallely ,则可以使用ThreadsMultiprocessing

您进行数据库调用,因此我可以假定您的应用程序受I / O约束。 在您的方案中,您可以使用threading模块。 使每个线程执行IO调用,如下所示:

准备文件:

root@123-PC:/tmp/test$ for i in {a,b,c,d,e}; do echo foo_$i > $i;done
root@123-PC:/tmp/test$ ls
a  b  c  d  e

并行运行代码:

import threading
import time
import random

def worker(f_n):
    with open(f_n) as f:
        time.sleep(random.random())
        print f_n, " => ", f.read()

f_list = ['a','b', 'c', 'd', 'e']

threads = []
for f_n in f_list:
    t = threading.Thread(target=worker, args=(f_n))
    threads.append(t)

for t in threads:
    t.start()


for t in threads:
    t.join()

第一次输出:

a  =>  foo_a

e  =>  foo_e

b  =>  foo_b

c  =>  foo_c

d  =>  foo_d

第二次输出:

d  =>  foo_d

e  =>  foo_e

a  =>  foo_a

b  =>  foo_b

c  =>  foo_c

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM