का उपयोग करके बहुत बड़ा इनपुट और पाइपिंग मुझे बहुत सरल समस्या है। मेरे पास एक बड़ी फाइल है जो तीन चरणों से गुज़रती है, एक बाहरी प्रोग्राम का उपयोग करके एक डिकोडिंग चरण, पाइथन में कुछ प्रोसेसिंग, और फिर किसी अन्य बाहरी प्रोग्राम का उपयोग करके रिकोडिंग। मैं यूनिक्स पाइप बनाने के बजाय पायथन में ऐसा करने की कोशिश करने के लिए subprocess.Popen() का उपयोग कर रहा हूं। हालांकि, सभी डेटा स्मृति में buffered हैं। क्या इस कार्य को करने का कोई पागल तरीका है, या क्या मैं एक साधारण पायथन लिपि पर वापस आ रहा हूं जो स्टडीन से पढ़ता है और किसी भी तरफ यूनिक्स पाइप के साथ stdout लिखता है?subprocess.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))
* एक बड़ी फ़ाइल * क्या है? – eumiro
अच्छा सवाल। उपलब्ध रैम से बड़ा। – seandavi
मेरे हिस्से पर बेवकूफ त्रुटि। मैंने उपरोक्त लूप में पढ़ने() विधि का उपयोग किया। सही पंक्ति को निश्चित रूप से .read() नहीं होना चाहिए क्योंकि samtools.stdout वास्तव में एक फ़ाइल जैसी वस्तु है। – seandavi