ruby-robotの夢

cygwin-ruby,qgisの達人を目指す奮闘記

cygwin-Ruby-WIN32OLE-IE の使用可能なメモリー限界?

雨量データのダウンロード

台風19号の雨の確率規模を、より正確に評価するため、気象庁の雨データを大量にダウンロードしようとしていた。

具体には、全部で約700地点で、50年分の日データを取得しようとしていた。これを元に、日雨量の多い日の前後の時間雨量を収集して時間別の確率雨量を整理しようというものである。これを、ruby-WIN32OLEでIE11をコントロールして取り込むのである。

1月分のHTMLから日データをダウンロードに要する時間は、約0.5秒で、全部DLするのに、70時間くらいと見込まれた。

夜間も動かしてみたが、翌朝になってみると、想定内であるが、止まっていた。意外にも、ファイルの時刻から朝7:30まで12時間以上動いていたことである。

Rubyの異常動作

Windowsを再起動してrubyプログラムを再開した。

すると、異常に動作が遅くなった。改めて、Windowsを再起度、クッキーの削除等してみるが、効き目は無い。

これまで、様々なデータについてダウンローダーを作ってダウンロードしたが、最悪クラスだ。直ぐにフリーズして動かなくなる。通信条件に移譲はなさそうであった。

rubyIEが動かないだけならよいが、やっかいなことに、Windows全体が鈍くなり、最終的には強制終了を余儀なくされた。

ハードはcorei5-quad、SSD,Windows10(64),cygwin(64),Rubyのバージョンは、2.6.4p104(2019-08-28) インターネット回線は、上下共100Mbyte専用回線で、かなり安定している。

原因の推定

データのダウンロードは、データ要素別に1個のテキストに追加する形とし、出力は、appendモード、重複を避けるため、実行前に、日雨量のみ内容をHashに読み込んでデータの有無を確認して未登録データをダウンロードすることとしている。

出力ファイルは、200地点分になっており、サイズは要素毎に、12万ヶ月分、13MByte。

大したメモリーとは思わなかったが、これを読み込んで作られるHashの影響なのか、過大なメモリーを消費していることが原因のようだ。実行中にメモリーが増大し、プロセスは、400Mbyte程度消費していた。

ちなみに、全メモリーは、16Gであるが、rubyの動作には、この程度が限界なのかもしれない。Hashではなく、Arrayにすれば、また違っているかもしれない。Hashの作り方も問題があるかもしれない。

解決方法

このHashを作らずに番号を指定して重複を避けるようにすると、元のスムーズな動作にもどった。

ハード、OS,cygwin,rubyの環境設定による影響もあろうが、メモリーの使い方の工夫の必要性に気づかされた。

 

ここまで書いて、かつて、同等に苦労した例を思い出した。I-Town-Pageデータのダウンロードだ。ある流域において、市区町村単位で、全件データをダウンロードしようとすると、大きめの市では数万件に及ぶ。このときは何度も固まるのを、ループを重ねてなんとかダウンロードした。次回は、Hashの作り方の工夫等で対応してみよう。

Hash.clear の問題

改良したプログラムで、スムーズになったが、ハッシュが大きいと、タスクマネージャに示されるメモリーサイズには、次第に大きくなる。

50地点分のHashから、1地点分のHashに上書きしてメモリー節約を図ったが、実行中にメモリは、400Mb程度になってしまう。

Hashの構造は、{地点ID=>{データ種(時間雨量)=>[日付]}}であるが、

Hash.clearしても、メモリーは解放されないようだ。何か残ったものが悪さをする。

あらかじめ、地点別のデータを作成し、1地点のHashのみを作成した場合には、容量を小さく抑えて安定させることができた。

スムーズにIEが動かすためには、rubyのメモリーを50Mbyte程度に抑制するとよいようだ。

IEのメモリー状況の影響

こんなこともあった。24時間以上もの間、安定して動いていたのが、ふとみると、3倍くらい遅くなっていた。その時のIEのメモリーをみると、300Mbを超えていた。suspendして、IEでクッキー等を削除して、復帰させると、元のスピードに戻った。クッキー削除ⅴのIEのメモリーは、150Mb程度であった。

数万ページをアクセスする場合、IEのメモリー状況も監視が必要のようである。

複数プロセスの問題

モリーを抑制した仕組みとし、2つのプログラムで並行処理を試みた。

すると、同時にIEを動かすと、不安定となり、両方のIEがフリーズしてしまう。干渉するのだろうか。

同時起動はしないほうが良いかもしれない。

まとめと留意点

cygwin64-ruby2.6.3-winole32-IE11で、数万頁をダウンロードする場合の留意点について、現段階で、以下のことが言える。

rubyIEのメモリー使用条件により、徐々にメモリーが増大する場合があり、それぞれ400Mbyte程度で、システムダウンを伴う危険な状態も起こりうる。IEとの依存関係があると考えられる。

rubyで大容量の変数(Hashで確認された)を作らないことは有効。いったん作成した変数のメモリーは、clearしても解放れない。50Mbyte程度が目安か。100Mbyte超えている時と比べると、倍近い速度になる。

IEプロセスのメモリーも大きくならないよう、履歴のメモリを制限する。動作中にsuspendしてIEのオプションで削除することも有効。これも、ダウンローダに組み込んでやれるとよいかもしれない。※suspendせずにやろうとすると、エラー。

補足

日データのダウンロードが終わったので、時間データを取得しようとした。

時間データは、地点により、データ項目が少ない。また、ページ毎のデータ数も少ないため、ページ単位の取得時間は、0.3秒程度となる。調子よくダウンロードできるのだが、突如として止まってしまう場合があった。この原因はよくわからないが、早すぎると、気象庁サーバー側が、サイバー攻撃判定してブロックする可能性もある。ほどほどのスピードが良いかもしれない。

数千ページにアクセスする場合、例えば、500ページ程度で、ie.quitし、新たに作り直すことも、安定した動作を確保しやすいと考えられる。

 

なお、上記作業はIEはVisibleで行っている。これまでの経験上、invisibleにしても効果は小さく、止まった時の処理が面倒だという理由による。