1

2 つの座標 (行の 2 番目と 3 番目の単語) を比較して、それらが重なっている場所を確認できるようにする必要があります。さて、私のコードはそれを行いますが、非常に遅くなります。これまでのところ、10000 行のファイルの場合、私のコードには約 2 分かかります。30 億行のファイルに使用する必要がありますが、これには永遠にかかると見積もっています。私のコードをリファクタリングしてもっと速くする方法はありますか?

これまでのところ、私は自分がやりたいことを正確に行うことができます。これはどれですか:

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

前もって感謝します

4

1 に答える 1

2

bedtools を使用することをお勧めします。

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

Intersect 関数は、おそらくあなたが望むことをします。

また、bedtools を使用するかどうかにかかわらず、最初に 2 つの入力ファイルを並べ替えることでアルゴリズムを改善できます。

于 2015-06-25T11:57:52.307 に答える