2015-06-24 10 views
1

Мне нужно иметь возможность сравнить две координаты (второе и третье слово в строке), чтобы увидеть, где они пересекаются. Теперь мой код делает это, но он делает это очень медленно. Пока для файла с 10000 строк мой код занимает около двух минут. Мне нужно использовать его для файла с 3 миллиардами строк, который, по моим оценкам, займет навсегда. Есть ли способ реорганизовать мой код так быстро?Как быстро сравнить два файла?

До сих пор я могу делать именно то, что хочу. Что это:

import os.path 
with open("Output.txt", "w") as result: 
    with open("bedgraph2.txt") as file1: 
    for f1_line in file1: 
     segment_1 = f1_line.split() 
     with open("bedgraph1.txt") as file2: 
     for f2_line in file2: 
      segment_2 = f2_line.split() 
      if (int(segment_1[2]) > int(segment_2[1])) & (int(segment_1[1]) < int(segment_2[2])): 
      with open("Output.txt", "a") as add: 
       add.write(segment_1[0]) 
       add.write(" ") 
       add.write(segment_1[1]) 
       add.write(" ") 
       add.write(segment_1[2]) 
       add.write(" ") 
       add.write(segment_1[3]) 
       add.write(" | ") 
       add.write(segment_2[0]) 
       add.write(" ") 
       add.write(segment_2[1]) 
       add.write(" ") 
       add.write(segment_2[2]) 
       add.write(" ") 
       add.write(segment_2[3]) 
       add.write("\n") 
      break 

print "done" 

Это образец данных

bedgraph2.txt 
chr01 1780 1795 -0.811494 
chr01 1795 1809 -1.622988 
chr01 1809 1829 -2.434482 
chr01 1829 1830 -3.245976 
chr01 1830 1845 -2.434482 
chr01 1845 1859 -1.622988 
chr01 1859 1879 -0.811494 
chr01 1934 1984 -0.811494 
chr01 3550 3600 -0.811494 
chr01 3790 3840 -0.811494 
chr01 3882 3902 -0.811494 
chr01 3902 3932 -1.622988 


bedgraph1.txt 
chr01 1809 1859 -1.139687 
chr01 1965 2015 -1.139687 
chr01 3790 3840 -1.139687 
chr01 3930 3942 -1.139687 
chr01 3942 3980 -2.279375 
chr01 3980 3992 -1.139687 
chr01 4260 4310 -1.139687 
chr01 4361 4382 -1.139687 
chr01 4382 4411 -2.279375 
chr01 4411 4432 -1.139687 
chr01 4473 4523 -1.139687 
chr01 4605 4655 -1.139687 

Заранее спасибо

+2

1. Это не займет много времени, всего 10 часов. :) 2. Пробовали ли вы комбинировать открытия файлов, например. 'с открытым (« Output.txt »,« w ») в качестве результата, open (« bedgraph2.txt ») как file1, с открытым (« bedgraph1.txt ») как file2:' и выполнив обработку? Думаю, вы тратите много накладных расходов на это. 3. Этот вопрос лучше подходит для [Обзор кода] (http://codereview.stackexchange.com/). – TigerhawkT3

+2

Возможно, вам захочется объяснить, что вы хотите достичь. [ask] – boardrider

+1

Вы можете сравнить их с помощью hash ('md5' или какой-либо другой), но это будет успешным, только если файлы строго одинаковы. –

ответ

2

Я предлагаю использовать bedtools:

функция

http://bedtools.readthedocs.org/en/latest/

Intersect вероятно делает то, что вы хотите.

Кроме того, с использованием постельных принадлежностей или нет, алгоритм может быть улучшен путем первой сортировки двух входных файлов.

+0

Wow Я думаю, что это именно то, что я ищу. Большое спасибо! – user3904534

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