subprocess.Popen
の挙動の勉強になったので、忘れないようにメモ
pythonで巨大なファイルを扱うときは、全てをメモリに載せないよう、イテレータを使っての逐次処理を非常に頻繁に行う。
が、sorted()
関数は巨大なファイルに対しては使えない。これはイテレータをリストに変換してから処理を行うため。
巨大なファイルをソートしたいときはUnixシステム側のsortを使う
import subprocess
def sorted_file_generator(filename):
proc = subprocess.Popen(['sort', filename], stdout=subprocess.PIPE)
while True: # while を使って1行ずつ受け取る
line = proc.stdout.readline()
if line:
yield line.decode('utf-8').strip() # 返り値はバイトコードなのでデコードする
else:
break
この例はpython3です。
2の場合は、バイトの取り扱いが違うはず