vpnサーバーなどでpandasでcsvを読み込むときにcsvのサイズが大きすぎると「killed」と表示され、実行プロセスが勝手に終了してしまうことがあります。今日はその場合の対処法について自分が行っているアプローチをメモしておきます
原因
vpsでプロセスが勝手にkillされ、killedと表示されるときは基本的に処理に対してサーバーのメモリが不足している場合に発生します。特にpandasやseleniumはメモリをドカ食いするので1gbのサーバーでちょっと大きいサイズのCSVをread_csvとかで読み込もうとするとこういう事象が起きやすいかなと思います
解決法
①チャンクサイズで分割する
import pandas as pd csv_file_path="C://user/~~" chunk_size = 10000 # 1回に読み込む行数 chunks = pd.read_csv(csv_file_path, encoding="cp932", chunksize=chunk_size) df2 = pd.concat([chunk for chunk in chunks])
pandasのメモリエラー系のエラーメッセージでググるとこの方法がよくヒットするが、個人的な体感ではぶっちゃけこれであまり解決した試しはない。ここまでして読み込まないといけない時点で後の処理でメモリが爆発するのでぶっちゃけ実行するPCのメモリやスペックを上げるか、read_csvを使わないアルゴリズムにするといった抜本的な方針転換が必要なケースが多いと思う
②特定の列だけ読み込むように指定する
read_csvは引数でcsvの特定の列だけを読み込むことができます。不要な列が多くそのせいでメモリ不足が発生している場合は「usecols」という引数に列名リストを指定して特定の列だけを読み込むようにすることでメモリを節約できます
import pandas as pd #CSVのパス csv_file_path="C://user~~~~" # 読み込みたい列の名前をリストで指定 columns_to_load = [ "列名①", "列名②", …] df = pd.read_csv(csv_file_path, encoding="cp932", usecols=columns_to_load)
コメント