困っていること
Pythonでスクレイピングしたリストをextendして、大きなデータベースをつくっています。
大量にあるデータを、800回くらいのforループで回します。
この時、毎回extend後に、新しいリストが作られているようで、ループの途中でメモリリークを起こしてしまいます。
全て連結したあとのデータサイズは2GB程度で、ひとつひとつの小さなデータは大きくても数百KBです。きちんとメモリが解放されているようなら、問題なくプログラムは終了すると思うのですが、これはPythonの仕様なのでしょうか。
実現したいこと
メモリを解放するなどして、メモリの使用可能領域を適切に増やしたいです。
該当のソースコード
python
1def create_data(file_name): 2 with gzip.open(file_name, 'rt',) as f: 3 content = f.readlines() 4 content = [sub.split(",") for sub in content] 5 return content 6 7data = [] 8for f in files_list: 9 new_content = create_data(f) 10 data.extend(new_content) 11
要約したコードです。
create_data関数には他の処理も入りますが、そこは省略しました。確認のため、返りのファイルサイズを毎回取得すると、大きい場合は、例えば90MBなどのこともありますが、ほとんどが数百KBです。
また、一つ訂正です。
> 毎回extend後に、新しいリストが作られているようで、
と質問に書きましたが、オブジェクトにのidを確認すると、同じ値だったので、この認識は間違っていたようです。ですが、試しにextend()をコメントアウトして、ファイルのopenだけをループするとメモリは増えず、最後まで処理は回ります。問題の切り分けをして、extend()の箇所に問題があるのではないかと考えました。extend()すると、読み込んだファイル以上にメモリを消費してしまいます。
先ほど気がついたことですが、extend後のdata
を__sizeof__()でチェックすると、ループの途中で増えていなことがあることに気づきました。170MBくらいから数ループ増えず、しばらくするとまた増えるということを繰り返します。ただ、len()でリストのサイズの確認すると毎回data
の長さは大きくなっています。sizeof()の結果は、逐次print()で出力しながらの確認です。
extemd後のdata
の末尾は毎回変化していました。全体の内容がどうなっているかはこれからのチェックになりますが、ここまでの説明で問題の可能性を指摘していただける方はいないでしょうか。

回答1件
あなたの回答
tips
プレビュー