Python 多进程,多个进程读取同一文件
我试图模拟一些dna测序读取,为了加速代码,我需要并行运行它 基本上,我要做的是:我对人类基因组的读取数据进行采样,我认为多处理模块的一对二过程试图从同一个文件(人类基因组)中获取数据。这些过程被破坏,无法获得所需的DNA序列。我尝试过不同的事情,但我对并行编程非常陌生,无法解决我的问题 当我用一个内核运行脚本时,它工作得很好 这就是我调用函数的方式Python 多进程,多个进程读取同一文件,python,multiprocessing,biopython,pysam,Python,Multiprocessing,Biopython,Pysam,我试图模拟一些dna测序读取,为了加速代码,我需要并行运行它 基本上,我要做的是:我对人类基因组的读取数据进行采样,我认为多处理模块的一对二过程试图从同一个文件(人类基因组)中获取数据。这些过程被破坏,无法获得所需的DNA序列。我尝试过不同的事情,但我对并行编程非常陌生,无法解决我的问题 当我用一个内核运行脚本时,它工作得很好 这就是我调用函数的方式 if __name__ == '__main__': jobs = [] # init the processes for
if __name__ == '__main__':
jobs = []
# init the processes
for i in range(number_of_cores):
length= 100
lock = mp.Manager().Lock()
p = mp.Process(target=simulations.sim_reads,args=(lock,FastaFile, "/home/inigo/msc_thesis/genome_data/hg38.fa",length,paired,results_dir,spawn_reads[i],temp_file_names[i]))
jobs.append(p)
p.start()
for p in jobs:
p.join()
这是我用来获取读取的函数,每个进程都将数据写入不同的文件
def sim_single_end(lc,fastafile,chr,chr_pos_start,chr_pos_end,read_length, unique_id):
lc.acquire()
left_split_read = fastafile.fetch(chr, chr_pos_end - (read_length / 2), chr_pos_end)
right_split_read = fastafile.fetch(chr, chr_pos_start, chr_pos_start + (read_length / 2))
reversed_left_split_read = left_split_read[::-1]
total_read = reversed_left_split_read + right_split_read
seq_id = "id:%s-%s|left_pos:%s-%s|right:%s-%s " % (unique_id,chr, int(chr_pos_end - (read_length / 2)), int(chr_pos_end), int(chr_pos_start),int(chr_pos_start + (read_length / 2)))
quality = "I" * read_length
fastq_string = "@%s\n%s\n+\n%s\n" % (seq_id, total_read, quality)
lc.release()
new_record = SeqIO.read(StringIO(fastq_string), "fastq")
return(new_record)
以下是回溯:
回溯(最近一次呼叫最后一次):
文件“/usr/lib/python3.5/multiprocessing/process.py”,第249行,在引导程序中
self.run()
文件“/usr/lib/python3.5/multiprocessing/process.py”,第93行,正在运行
自我目标(*自我参数,**自我参数)
sim_ecc_中的第107行文件“/home/inigo/Dropbox/PycharmProjects/circ_dna/simulations.py”
新建读取=模拟单端(lc、快速文件、chr、chr位置开始、chr位置结束、读取长度、读取id)
文件“/home/inigo/Dropbox/PycharmProjects/circ_dna/simulations.py”,第132行,模拟单端
new_record=SeqIO.read(StringIO(fastq_字符串),“fastq”)
文件“/usr/local/lib/python3.5/dist-packages/Bio/SeqIO/_-init__.py”,第664行,已读
first=next(迭代器)
文件“/usr/local/lib/python3.5/dist packages/Bio/SeqIO/_init__.py”,第600行,在parse中
对于i中的r:
文件“/usr/local/lib/python3.5/dist-packages/Bio/SeqIO/QualityIO.py”,第1031行,在FastQphrediter中
对于FastQGeneraliator(句柄)中的标题行、顺序字符串、质量字符串:
文件“/usr/local/lib/python3.5/dist packages/Bio/SeqIO/QualityIO.py”,第951行,在FastQGeneraliator中
%(标题行、序号、序号(质量字符串))
ValueError:id:6-chr1_KI270707v1|u random | left_pos:50511537-50511587 | right:5051214-50511264(0和100)的序列长度和质量值不同。
我是这个答案的执行者,我几乎在一年前就做过。问题是我用来读取人类基因组文件(pysam)的软件包失败了。这个问题是调用多处理时的输入错误
从作者的回复来看,这应该是可行的:
p = mp.Process(target=get_fasta, args=(genome_fa,))
注意“,”以确保传递元组
有关更多详细信息,请参见您尚未显示错误的回溯。如果进程每次都写入不同的文件,您可以事先将它们的所有读取行随机分配(确保没有重叠),将该列表分块并将一个分块传递给每个进程。只要你阻止他们同时读取文件,每个进程只会查看他们预先分配的数据块。除了错误本身,你已经包含了回溯。@roganjosh Hi!我已经添加了回溯。我已尝试阻止他们同时使用
Lock()
读取文件。然而,它没有起作用。我应该如何防止他们同时读取文件?@roganjosh我在Biopython和其他软件包开始停止之前添加了回溯,因为我试图编写一个空序列。我认为这不相关。不过,为了以防万一,我添加了它。我添加了完整的回溯,谢谢你的帮助