2017-02-20 4 views
1

Я пытаюсь имитировать некоторые чтения в формате dna, и, чтобы ускорить код, мне нужно запустить его параллельно.Многопроцесс, различные процессы, считывающие один и тот же файл

В основном, я пытаюсь сделать следующее: я читаю пробы из генома человека, и я думаю, что один из двух процессов из мультипроцессорного модуля пытается получить данные из одного и того же файла (генома человека) процессы повреждаются и не могут получить желаемую последовательность ДНК. Я пробовал разные вещи, но я очень новичок в параллельном программировании, и я не могу решить свою проблему.

Когда я запускаю скрипт с одним ядром, он отлично работает.

Это способ, которым я звоню функцию

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) 

Вот отслеживающий:

Traceback (most recent call last): 
    File "/usr/lib/python3.5/multiprocessing/process.py", line 249, in _bootstrap 
    self.run() 
    File "/usr/lib/python3.5/multiprocessing/process.py", line 93, in run 
    self._target(*self._args, **self._kwargs) 
    File "/home/inigo/Dropbox/PycharmProjects/circ_dna/simulations.py", line 107, in sim_ecc_reads 
    new_read = sim_single_end(lc,fastafile, chr, chr_pos_start, chr_pos_end, read_length, read_id) 
    File "/home/inigo/Dropbox/PycharmProjects/circ_dna/simulations.py", line 132, in sim_single_end 
    new_record = SeqIO.read(StringIO(fastq_string), "fastq") 
    File "/usr/local/lib/python3.5/dist-packages/Bio/SeqIO/__init__.py", line 664, in read 
    first = next(iterator) 
    File "/usr/local/lib/python3.5/dist-packages/Bio/SeqIO/__init__.py", line 600, in parse 
for r in i: 
    File "/usr/local/lib/python3.5/dist-packages/Bio/SeqIO/QualityIO.py", line 1031, in FastqPhredIterator 
for title_line, seq_string, quality_string in FastqGeneralIterator(handle): 
    File "/usr/local/lib/python3.5/dist-packages/Bio/SeqIO/QualityIO.py", line 951, in FastqGeneralIterator 
% (title_line, seq_len, len(quality_string))) 

ValueError: Lengths of sequence and quality values differs for id:6-chr1_KI270707v1_random|left_pos:50511537-50511587|right:50511214-50511264 (0 and 100). 
+0

Вы не показали отслеживающий ошибки. Если процессы записываются в другой файл каждый раз, вы можете заранее рандомизировать все свои строки чтения (не накладывая друг на друга), перечислить этот список и передать кусок каждому процессу. Пока вы не позволяете им читать файл одновременно, каждый процесс будет рассматривать только их предварительно выделенные фрагменты. – roganjosh

+1

Вы включили трассировку, за исключением самой ошибки. – roganjosh

+0

@roganjosh Привет! Я добавил трассировку. Я пытаюсь помешать им прочитать файл одновременно с 'Lock()'. Однако это не сработало. Как я должен помешать им читать файл одновременно? – Praderas

ответ

0

Я О.П. этого ответа, что я сделал почти год назад. Проблема заключалась в том, что пакет, который я использовал для чтения файла генома человека (pysam), терпел неудачу. Проблема была опечаткой при вызове многопроцессорности.

От авторов откоса, это должно работать:

p = mp.Process(target=get_fasta, args=(genome_fa,)) 

Отметьте «», чтобы убедиться, что вы пройти кортеж

См https://github.com/pysam-developers/pysam/issues/409 для более подробной информации

Смежные вопросы