実現したいこと
メモリをたくさん使う機能を実行していると急にプロセスが止まります。
エラーではないのでどのように対応したらいいか分からず、もう一度動くようにしたいです。
発生している問題・分からないこと
Outofmemoryerrorとかではなくて単純に止まります。
頻繁に止まる場所は特定のループ処理の途中のことが多いです。厄介なのは同じ条件(開いているソフト、同じインプット)で実行してもループ処理の止まる場所は毎回違いますし、またループ処理を抜けて先の処理で止まるときもありますし、止まらない時もあります。
下記が頻繁にあるループ内で止まるときのログです。
generated 1270000 events | 08:09:51
generated 1280000 events | 08:09:51
generated 1290000 events | 08:09:51
generated 1300000 events | 08:09:51
↑ここで止まるみたいな感じです。
メモリ使用量は94~100%近く、cpu使用量は20%以下、ディスク使用料は1瞬だけ100%近くなりその後は数パーセントです。ハードフォルトは150とか200の時があります。
止まってから徐々にメモリとコミットが減っていき、放っておくと半分以下にまで減っていくことが分かっています。
エラーメッセージ
error
1エラーは出ずに単純にプロセスが止まるだけなので貼れません。
該当のソースコード
Julia
1# 上記で言及したループ処理です。 2 3events = Vector{NamedTuple{(:date, :type, :trade_idx, :invest, :code),Tuple{Date,Symbol,Int,Float64,String}}}() 4 5count_evt = 0 6 7for i in 1:n 8 code_str = string(df.code[i]) # code を文字列化(Int/String 両対応) 9 push!(events, (date=df.entry_date[i], type=:entry, trade_idx=i, invest=df.invest[i], code=code_str)) 10 push!(events, (date=df.exit_date[i], type=:exit, trade_idx=i, invest=df.invest[i], code=code_str)) 11 12 # debug 13 count_evt += 1 14 if count_evt % 10000 == 0 15 println("generated $count_evt events | $(Dates.format(Dates.now(), "HH:MM:SS"))") 16 end 17 # debug 18end
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
-
検索
teratailやgoogleで検索をしてみたのですが僕が探した日本語と英語の範疇では該当する問題に言及している記事を見つけられませんでした。やはりみんなエラーが出て止まっているようでエラーも出ずにプロセスが止まる事例が見つけられませんでした。 -
ソースコードを自分なりに変更した
そもそもこのコードは株の検証を行うのに使っているコードです。
2022年からのデータ(約400万行DF)を使用すると止まることがなく完遂できるんですが2011年からのデータ(約1400万行DF)を使うと止まります。
このことからメモリ圧迫が原因かと思い使用するDFを1400万行DF->1200万行に圧縮するように変更しました。結果として変わらずとまります。 -
ChatGptと会話しながら原因究明
いろいろなケースを考えてchatgptとコードを共有しながら確認を1日しましたが結局なぜそれが起こるのかわかりませんでした。
補足
- リストJuliaは最新のJulia Version 1.12.5です。
- スレッド競合がエラーかと思い1スレッドで実行しましたが同じく止まります。
- GCのタイミングで止まったのかと思いGC.enable_logging(true)を入れてみたのですが止まったタイミングではログは出ていませんでした。
- このエラーが起きるようになる前に1度パソコンがクラッシュしています、多分処理をさせ過ぎて落ちたんだと思います。それ以降止まるようになったのでセーフティーがかかったのかとも思ったのですが自分で変更したわけではないですし、該当しそうなものは見つかりませんでした。