2016-03-29 12 views
0

GZファイル:Pythonスクリプト遅いの読み取りと書き込み、そのような形式で30億ライン持って、私はxxx.wig.gzファイルを持っている

fixedStep chrom=chr1 start=1 step=1 
0 
0 
0 
0 
0 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
... 
fixedStep chrom=chr2 start=1 step=1 
0 
0 
0 
0 
0 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
... 

を、私は

  1. 休憩それをすることによってしたいです"クロム"。ですから、私が "fixedstep"で始まる行を読むたびに、私は新しいファイルを作成し、古いファイルを閉じます。
  2. 私は下記そうでなければ0

合格= 1、「閾値」にそれぞれの値を比較して0/1の出力をしたいので、(私はそれが〜10hoursを完了するために、突出していますスーパースロー走る私のPythonスクリプトであります〜2時間後に2つの染色体が完成)

私はそれを改善するのに助けてくれる人がいますか?

#!/bin/env python  
import gzip  
import re  
import os  
import sys 

fn = sys.argv[1]  
f = gzip.open(fn)  
fo_base = os.path.basename(fn).rstrip('.wig').rstrip('.wig.gz')  
fo_ext = '.bt.gz'  
thres = 100  
fo = None  
for l in f:  
    if l.startswith("fixedStep"):  
     if fo is not None:  
      fo.flush()  
      fo.close()  
     fon = re.search(r'chrom=(\w*)', l).group(0).split('=')[-1]  
     fo = gzip.open(fo_base + "_" + fon + fo_ext,'wb')  
    else:  
     if int(l.strip())>= thres:  
      fo.write("1\n")  
     else:  
      fo.write("0\n")  
if fo is not None:  
    fo.flush()  
    fo.close()  
f.close() 

PS。私はawkがはるかに速くできると仮定しますが、私はawkでうまくいきません。

+0

あなたは出力が提供されているサンプルデータのためにどのように見えるかの例を与えることができますか?おそらくchr1とchr2という2つのファイルのように見えます。 chr1とchr2の内容は何でしょうか? awkがかなり早くそれをやり遂げることができるのは間違いありませんが、テストデータが渡されていることを確認したいと思います。 – Andrew

答えて

1

ありがとうございました。
は、私は、読み取り/スクリプトに記述し、今では(ただし、まだ比較的遅い)数倍高速であるバッファリングを追加しました:

import io  
f = io.BufferedReader(gzip.open(fn))  
fo = io.BufferedWriter(gzip.open(fo_base + "." + fon + fo_ext,'wb'))  
関連する問題