[英]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
,则可以使用Threads
, Multiprocessing
。
您进行数据库调用,因此我可以假定您的应用程序受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.