【Python】巨大なファイル(ログ・csv等)を分割して圧縮する
# python
やりたいこと
間違ってor仕方なく巨大なデータが存在する場合ってありますよね。 渡しの場合は巨大な過去のデータ(数十GB)をWebAPI経由で取得していたのですが、本来は日付単位でファイルを分割しようとしていたのに、スクリプトを間違えて全部同じファイルに出力してしまっていました。
そこで困ったのが、ディスク容量がやばいので圧縮しようとしたところ、巨大なファイルを圧縮しようとしているせいで、PCの空き容量が足りないと怒られる… ファイルを分割して圧縮したかったけど、ちょうどいいコマンドもなさそうでした。 (分割してもよかったけど、全て分割することは毎回行数指定とかしなければ行けないので面倒で嫌だった。)
でも大丈夫。便利な道具がいっぱいある。
Pandasで解決してしまおう
csvの読み込みも高速らしいpandasで解決しました。
ポイントは ・read_csvの引数にchunksizeを指定し、返り値をループで回すこと。 (ループさせて初めてDataFrameを取り出せます。) ・to_csvの引数にcompression=‘gz’を指定して、gzip圧縮を行うこと。
import pandas as pd
// chunksizeを指定することで、一度に読み込む行数を指定できる。
reader = pd.read_csv('/foo/bar/some.1.log', chunksize=1000000)
i = 0
for r in reader:
// to_csvの引数にcompression='圧縮形式'を渡すことで圧縮済みのファイルが出力される。
r.to_csv(f'/foo/bar/some.{i}.log.gz', index=False,compression='gz')
i += 1
注意
そもそもpandasがcsvのようなデータを読み込むことを前提としているため、全てのファイルでうまくいくことは保証できません。 カンマがよく使われているようなデータではうまくいかない(or工夫が必要)になると思われます。