2016-03-29 12 views
0

ich eine xxx.wig.gz-Datei haben, die drei Milliarden Zeilen in einem solchen Format haben:Python-Skript langsam lesen und schreiben gz Dateien

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 
... 

und ich möchte

  1. brechen sie durch "Chrom". Jedes Mal, wenn ich eine Zeile lese, die mit "fixedstep" beginnt, erstelle ich eine neue Datei und schließe die alte.
  2. Ich mag 0/1 Ausgabe von jedem Wert auf eine „Schwelle“ zu vergleichen, pass = 1 sonst 0

unten ist mein Python-Skript, das super langsam läuft (ich bin Projizieren ~ 10 Stunden zu beenden, so weit 2 Chromosomen nach ~ 1 Stunde)

kann jemand mir helfen, es zu verbessern?

#!/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. Ich nehme an, awk kann es viel schneller tun, aber ich bin nicht großartig mit awk

+0

Können Sie ein Beispiel geben, wie die Ausgabe für die Beispieldaten zur Verfügung gestellt aussehen würde? Es scheint, als wären das 2 Dateien, vielleicht chr1 und chr2. Was wären die Inhalte von Chr1 und Chr2? Sie haben Recht, dass awk in der Lage ist, es ziemlich schnell zu tun, vermute ich, aber ich möchte sicherstellen, dass es Ihre Testdaten übergibt. – Andrew

Antwort

1

Danke Summer für die Bearbeitung des Textes.
Ich habe gepufferte Lese-/Schreibzugriff auf das Skript und jetzt ist es mehrmals schneller (noch relativ langsam aber):

import io  
f = io.BufferedReader(gzip.open(fn))  
fo = io.BufferedWriter(gzip.open(fo_base + "." + fon + fo_ext,'wb'))  
Verwandte Themen