大量のデータを生成する外部プログラム (サードパーティ、私はそれを制御できません) によって生成された出力を解析する必要があります。出力のサイズが使用可能なメモリを大幅に超えているため、プロセスの実行中に出力を解析し、既に処理されたデータをメモリから削除したいと考えています。
これまでのところ、私は次のようなことをしています:
import subprocess
p_pre = subprocess.Popen("preprocessor",stdout = subprocess.PIPE)
# preprocessor is an external bash script that produces the input for the third-party software
p_3party = subprocess.Popen("thirdparty",stdin = p_pre.stdout, stdout = subprocess.PIPE)
(data_to_parse,can_be_thrown) = p_3party.communicate()
parsed_data = myparser(data_to_parse)
「サードパーティ」の出力が十分に小さい場合、このアプローチは機能します。しかし、Pythonのドキュメントに記載されているように:
読み取ったデータはメモリにバッファリングされるため、データ サイズが大きい場合や無制限の場合は、このメソッドを使用しないでください。
より良いアプローチ (実際に時間を節約できる可能性があります)data_to_parse
は、生成中に処理を開始し、解析が正しく行われたときに、data_to_parse
既に解析されたデータを削除して「クリア」することだと思います。
また、次のような for サイクルを使用しようとしました。
parsed_data=[]
for i in p_3party.stdout:
parsed_data.append(myparser(i))
しかし、行き詰まり、その理由を理解できません。
それで、これを達成するための最良のアプローチは何ですか?知っておくべき問題は何ですか?