Mam dość prosty problem. Mam duży plik, który przechodzi przez trzy kroki, krok dekodowania za pomocą zewnętrznego programu, trochę przetwarzania w python, a następnie przekodowanie za pomocą innego zewnętrznego programu. Używam podprocesu.Popen(), aby spróbować zrobić to w pythonie, zamiast tworzyć rury unixowe. Jednak wszystkie dane są buforowane do pamięci. Czy jest jakiś pythonic sposób wykonania tego zadania, czy najlepiej wracam do prostego skryptu python, który czyta ze stdin i zapisuje na standardowe wyjście z rurami unixowymi po obu stronach?Bardzo duże wejście i orurowanie za pomocą podprocesu.Popen
import os, sys, subprocess
def main(infile,reflist):
print infile,reflist
samtoolsin = subprocess.Popen(["samtools","view",infile],
stdout=subprocess.PIPE,bufsize=1)
samtoolsout = subprocess.Popen(["samtools","import",reflist,"-",
infile+".tmp"],stdin=subprocess.PIPE,bufsize=1)
for line in samtoolsin.stdout.read():
if(line.startswith("@")):
samtoolsout.stdin.write(line)
else:
linesplit = line.split("\t")
if(linesplit[10]=="*"):
linesplit[9]="*"
samtoolsout.stdin.write("\t".join(linesplit))
Co to jest * duży plik *? – eumiro
Dobre pytanie. Większa niż dostępna pamięć RAM. – seandavi
Głupi błąd z mojej strony. Użyłem metody read() w pętli for powyżej. Poprawiona linia nie powinna oczywiście mieć funkcji .read(), ponieważ samtools.stdout jest w rzeczywistości obiektem podobnym do pliku. – seandavi