『Python は動作を停止しました』を解決するためにメモリを増設した話 (16GB ⇒ 48GB)

ブログ

Pythonパイソンで決算分析システムを作っていた時の話です。

Python で Pandasパンダス のデータフレームを操作していたら、Python が落ちました。

[Window Title]
Python

[Main Instruction]
Python は動作を停止しました

[Content]
問題が発生したため、プログラムが正しく動作しなくなりました。このプログラムを閉じてください。

[プログラムを終了します] [プログラムをデバッグします]

tryトライ 文でエラーをキャッチするとか、そういう次元ではなくて、Python そのものがクラッシュしました。

毎回落ちるというわけではなくて、クラッシュするときもあれば、しない時もあった。

それで、コードがクラッシュしていた場所です。

pandas.DataFrame のマージメソッド .merge() や、トゥーピックルメソッド .to_pickle()、トゥーエクセルメソッド .to_excel() でクラッシュしていました。

コードにログ出力をたくさん散りばめて、クラッシュするのを待った結果、それらのメソッドの直前で、ログが途切れていました。

『このあたりが原因…なのか?』

とりあえずメモリをチェック。

いつもお世話になっている memory_profiler ライブラリを使うも、処理に時間がかかりすぎて断念。

しかたなく、Python が落ちるのを待ちながら、ひたすらタスクマネージャーを見ていました。

で、それらのメソッドで、ごくまれに、メモリをたくさん消費する瞬間がありました。

そしてたまに、『Python は動作を停止しました』といって、落ちました。

一方で、めちゃめちゃメモリを食うけれど、処理が継続することもありました。

クラッシュの原因の1つは、不揃ふぞろいなデータをマージしたことでした。

これは、データフレームを小さく整えてからマージ df.merge() することで解決しました。

もう1つ、クラッシュの原因は、(たぶんですが)データフレームの内容が複雑になりすぎていたことでした。

これは、データフレームを保存する直前に、pd.DataFrame() や df.copy(deep=true) でオブジェクトを新しくすることで解決しました。

これらの対策で、クラッシュの頻度はだいぶ下がりました。

ですが、年々 XBRL のファイル量が増えてきたせいか、徐々にまたクラッシュする頻度が上がってきました。

もはや、マルチプロセス処理では処理が完了できないレベルにまで来て、部分的にシングルプロセス処理に戻していました。

残りの原因がわかりません。敗北しました。敗北者です。

結局、解決方法ですが、最新の高性能な PC に移行しました。

とくにメモリです。DDR3 16GB ⇒ DDR4 48GB に増やしました。

3倍です。

メモリマシマシです。

これで、『Python は動作を停止しました』が出なくなりました。

いまのところ、マルチプロセス処理で6プロセスを並列に実行しても、問題は起きていません。

今後さらに XBRL データが増えていけば、また問題が発生するのかもしれません。

ですが、とりあえず今動いていれば OK というのも最適解かと。

まあ、『本当にメモリ不足が原因だったのか?』というのは、まだ疑ってはいます。

もしかしたら、CPU を Core i5-3470S ⇒ Core i5-9500 にしたのが効いたのかもしれないし、OS を Windows 7 ⇒ Windows 10 にしたのが効いたのかもしれないし。

けれども、検証に時間がかかりすぎました。

現象は不定期に発生するし、数時間後に発生するし、一方で問題なく完了することもあるし。

そういったなかで、いたずらに真の原因を追うのは得策ではないと、そう思いました。

放っておいても、何かのひょうしに原因が分かっちゃったりするかもしれないですし。

とりあえず、Python そのものがクラッシュすることがなくなったので、とても快適です。

以前はクラッシュ頻度を下げるために、multiprocessing での並列処理を解除していました。

シングルプロセス処理に戻したモジュールでは、3時間で終わっていた処理が12時間もかかるように…。

それが、新 PC に移行したことで、6コア6スレッドをフルに使えるようになりました。

1コア当たりの性能も上がっていたようで、3時間かかっていた処理が2時間半でおわる、そんな感じでした。

もしこれが Ryzen Threadripper 3990X の 64 コア CPU なら、もっと爆速で完了するんでしょうね。

AMD の 64 コア 128 スレッド、Ryzen Threadripper 3990X。

Ryzen™ Threadripper™ 3990X | デスクトップ・プロセッサー | AMD

上場企業の決算グラフを作るといった用途なら、マルチプロセス処理が大活躍するので、とても魅力的です。

もちろん、いま使用している Intel の Core i5-9500 も凄くいいです。

インテル® Core™ i5-9500 プロセッサー (9M キャッシュ、最大 4.40 GHz) 製品仕様

性能が上がっているのに、消費電力が今までと同じくらい。

それでいて、価格も高くない。

Python の件があったので、新 PC を組み立てるにあたってメモリを多めに追加してみましたが、結果としては良かったです。

瞬間的なメモリ不足が原因と思われるクラッシュ』がおさまったのに加えて、『処理速度』も向上しました。

スポンサーリンク
シェアする(押すとSNS投稿用の『編集ページ』に移動します)
フォローする(RSSフィードに移動します)
スポンサーリンク
シラベルノート
タイトルとURLをコピーしました