multiprocessing を使っていて感じたことのメモ書き

メモをそのまま記載。きちんと整理したまとめは後日。

2013/5/24
バイト先で今はpythonのコードを書いている(いた)
解凍後4Gのjsonファイルは、30コア使えば数分でできた
解凍前4Gのjson.txt.gzはそうもいかない
挙動がぜんぜん違う
これあれや、前のC++でやったやつと同じやつや
同じように30コアで動かしたら全然進まないの
そもそも30コア回る以前の処理で遅い(行数数えるだけだよ?
25320005行とか言ってんの。そりゃ遅えわ。
やっと並列処理に入ったかと思ったら今度はメモリをバカ食いし始めた
研究室のサーバだから大量のリソースがあるけど、それにしてもヤバい
メモリ100G使用とか怒鳴られても仕方ない
30コアだとあっという間にメモリオーバーしそうだったので停止
考えた結果とりあえず20コアに変えて再挑戦してみる
やはり100Gは超えた
しかし今度はまともに動きそうなのでそのまま見守ってみる
待ってる間pythonのメモリ管理を検索してみた
ココらへんに書いてあることが良さそう
けど実際の挙動はやっぱり動かしてみないとわからない
こういう時にこそ大学で習うような知識を生かして計算量、データ量を見積もるべきなのだろう
そのうちそこら辺もできるようになっていきたい


メモリ食い尽くしたから一旦C-zで停止させてtop見ながら適当にkillしたらいきなりプロセスが暴走し始めた
規定のコア数超えて勝手にプロセスが走り始めて死ぬかと思った
急いでtop見ながらkill飛ばしまくる作業に入る
やはり生半可な知識で並列処理はしないほうがいいのかもしれない
ホントに肝が冷えた

2013/5/27
メモリ管理のためにmemory_profilerを入れてみた
共用サーバは権限がないので仕方なく手元のMacBook Airにpip install
こちらで挙動を見ればある程度わかるだろう、と思いきや動かない
もしやmultiprocessingとmemory_profilerは相性が悪い?
仕方なしにちょいちょいdel文を入れてみたりして調べる
消費メモリが爆発的に増加する箇所はまだ連想配列を使っていないから理由がよくわからない
サーバ上で動きを見ながら検索していたら「GC優秀だからdel文意味ない」と知り削除
topで各プロセスを監視していた意外なことにメモリをバカ食いしてるのは子プロセスではなく親プロセスだと判明
つまり子から回収したデータが飽和してるわけか
文字列のリストをそのまんま受け取ってるもんな…そりゃそうか

というわけでPoolなんて生っちょろい手段を捨て、本格的にmultiprocessingを学ぶことに
最悪共用メモリさえできればなんとかなりそうだ

で、pool,mapの箇所をprocess,start,joinに書き換えたら今度は動かない
いや、実行はしてる。プログラムは動いてる。けど進まない。
遅いのか停止してるのかもわからない状況。デバッグがしにくいことこの上ない

joinのタイミングが間違ってたようだ
一旦全てstartさせてからjoinするようにしたら無事実行できた
動かしてるくせに自分でもよくわかっていないことがまるわかりである
ところでtop眺めてると出てくるwatchdogとmigurationとksoftirqdってなんだろう
initもコンストラクタとかで聞くけどtopに常駐してる点が謎

2013/5/??
processで実行可能状態へ持っていった
うまいこと動いているように見えるのでそのまま放置してみる
(翌日)
プロセスが暴走している
直前まで正常に動いていたのにテストを受けている間に100プロセスを超えていた
明らかにサーバのロード量が危険域を突破している
慌てて研究室へ走りプロセスをAll kill
原因がさっぱりわからない
並列処理はきちんと管理しないと暴走したら後が大変という苦い経験を得た

2013/6/3
一旦別作業に割り当てられていたが再開
准教授の先生に聞いてみたところ「プロセスの継承」周りかもしれないとの助言を得る
しかしそれがなんのことかすらあまり良くわかっていない
ネットの情報に限界を感じて部屋からクックブックとエキスパートpythonとPythonProfessionalProgrammingを持ってくる
しかし参考になったのは今のところエキスパート本のみ
並列処理に関するあれこれが載っている
「参考」という程度で、解決はしていない
クックブックは使っているのがthreadモジュールな上難しくて読めない
しかたなくネットの情報漁りを再開
一度Poolから離れてProcessを使ったためか拾える情報量が増えている
それでもやっぱりまだわからない
仕方なくドキュメントを拾い読みではなくキチンと目を通すことにする
今後の目的としては「ログの取得」と「プロセス数の管理」になる
常に実行中のログを拾いつつ、プロセス数が異常値に突入した場合はプロセス追加を停止(ないし全プロセス停止)
ともかくこれで再現した場合でも対処可能な状況に持ち込まなければ
原因把握なしの問題解決なんて怖くてできそうにない

追記)
ドキュメントは何かを知るのにつくづく向いていないなと思う
もちろん「できない」というわけではないのだが、「しづらい」と言わざるを得ない
既に知っている人間が何かを調べたり、確認したりするのにはとても向いている
反面、まだ知らない人間が何かを知ろうとするときは読みづらいだけに感じる
ドキュメントが重要であることはもちろん、目を通すことは必須とも言っていいだろう
しかし「初めて触ってみよう」と思う人に対しては別の文章が適切だと思う
それこそ「◯◯入門」のような文章が
しかしそういった文章はブログなどにさらさらっと必要最低限書かれているのみである