2017年6月28日水曜日

EXCELで LandXML 読み込み

CTC さんの GEORAMA で地質モデルを作ると、各地層サーフェスが LandXML 形式で geotmp フォルダに書き出されます。

分布範囲のみではあるものの、そこから座標を取り出して変換すれば、他のソフトに楽に持っていけるのになあ、と以前より考えていました。数年前に調べた限りでは、そのような変換ソフトがなく放置していたのですが、「TXT データを成形するだけなのですぐ書けるでしょう」「XML の理解に繋がるでしょう」などと思い自分で組むことに。幸い、EXCEL VBA を始め、各種言語で XML を取り扱う情報は Web 上にあふれていました。便利な時代になったものです。

作業は順調に進んでいたのですが、MSXML パーサーのバージョンに引っ掛かりました。
Win10 + EXCEL 2013 VBA で 6.0 を参照していたのですが、Web 上では古いVer.を参照したコードが多いようで、それらをコピペして動かしてもエラーを吐きます。それが Ver. 違いということに気づくまで、少し時間を要しました。(特にココ→MSXML2.DOMDocument60
他にも、名前空間(xmlns) に引っ掛かりました。ええ、まったくの初心者です。

XML では情報がタグ付けされているため、欲しい箇所へのアクセスが容易です。そのため、最終的には思ったよりもすっきりしたコードになりました。拡張もアクセスも楽、コードも簡素、なかなか良い仕様・特徴だと思います。XML が広まった理由、少し理解できました。

結果的には理解するのに2晩かかったのですが、良い経験になったと思います。

2017年6月25日日曜日

R apply の問題

Rでは、for 文の代わりに apply 群を使われる方が多いようです。

確かに、apply 群を使って書く方が、簡素で読み易いと思います。また、for 文より速くなる場合があるようで、web上ではしきりにお勧めされていました。(apply の中で for が使用されていましたので、劇的に、ということはないと思いますが)。

念のため、apply や lapply を使用して書き直し。
もともと、dependency を算出する関数が、ベクトルを扱えなかったこと、並列化をもくろんでいたことからfor を使っていました。今回は、関数の引数にリストから値を代入する関数を作り、それを apply や lapply で呼んでみました。

で、計算!

が、ダメ。

夜中に計算をかけて、朝に「終わったかな?」と確認しようとすると、動きが異常に遅い。SSDにスワップファイルを作っているようです。リソースモニターを見ると、物理メモリ24GBを使い切っていました。for や foreachであれば、ループのたびに変数を入れ替えながら計算が進むため、それほど大きなメモリは必要としません。が、apply 群では大きなマトリックスをそのまま保持して計算が進んでいくため、いくつかの計算ステップが進めば簡単にメモリ不足に陥るのでしょう。
計算が進むたびに途中経過をディスクに書き出せばメモリを解放できますが、遅くなります。ま、扱うデータの容量を考えながら、方法を選択しないといけないのでしょうね。ビッグデータを扱う場合のパッケージもあるようですので、必要になった段階で検討してみましょう。

いずれにしても、今回は並列化のほうが速いという結果になりました。

コア数   計算時間 メモリ
for(Single) 11.5h  300MB
foreach(4)  3.7h  1.5GB
foreach(6)  3.8h  1.8GB
apply(Single)6hで中止 20GB以上

これで進めてみましょう。

2017年6月23日金曜日

R foreach で並列化

R で並列化・高速化を扱う場合、以下の2通りがあるようです。

1. 関数をC/C++ に移植。さらにCUDAを利用
2. foreach による並列化

頻繁に使うツールであれば前者でしょうが、今回はそこまでの頻度・意欲がありません。で、2を選択。

最初はビルド時の自動並列化のようなオプションがあるのか?と思い探してみましたが、見当たりません。代わりに見つけたのが 2 の foreach 。
R では、for を foreach に変更するだけで並列化してくれるようです。容易なためか、メジャーな手法のようですね。

先日のコードに対し foreach を使って並列化。
が、今度は排他制御に関するコマンドが見つかりません。複数のスレッドから同一変数への書き込みを避け、ファイルに追記するよう変更したのですが、タイミングが重なった場合にデータが飛んでしまいます。このあたりを制御するコマンドが見当たりません。また、foreach 内の break も効かないようです。

そのままではうまく動いてくれなかったので、部分的にコードを書き直し。

っで、計算!

今度はうまくいきまた。

1 コアで 11.5 時間だったのが、4 コアで 3.7 時間まで短縮できました。
6 コアでも計算してみましたが、頭打ち。メモリへのアクセスが集中しますので、遅くなったのでしょうか。
ま、それほど早い計算時間でもないのですが、このあたりが落としどころでしょうね。これ以上は 1 の方法、R から C へ移植しするしかないでしょう(実務なら、迷わずそちらを選びますが)。

扱いたいデータがもっと大きなサイズですので、3.7時間という結果は大きな制約です。データの前処理を考えないとだめでしょうね。なんだかベクトル化の方が早いかも?と思えてきました。

で、もう一度チャレンジ。

今度はクリアーできましたが、新たに問題発生。


続きは後日。

2017年6月21日水曜日

R の for 文

以下の文献に掲載されているアルゴリズムの実装に取り組んでいました。

榊原ほか「 ラフ集合を用いたデータマイニングによるがけ崩れ発生要因の抽出に関する研究」 土木学会論文集 No. 658/VI-48, p. 221-229, 2000. 9
(1) 整合度の要求水準を設定する.
(2) 要因数が1っの場合の整合度を求め, 要求水準と比較する. 少なくとも1つの要因において整合度が要求水準上回った場合, 最小必要要因数は1となる.
(3) すべての要因について, 整合度が要求水準を下回っていた場合, 2つの要因の組み合わせに関する整合度を求め, 要求水準と比較する.
(4) 以下順次要因数を増加させ, 整合度が要求水準を初めて上回った時点における要因数を最小必要要因数とする.

要は、順次総当たりでラフ集合の下近似を計算し、dependency を求め、閾値を上回れば終了といった内容です。
いくつかの会社や大学が特許を取られているようですので、実務で使わないほうがよさそうです。https://www7.j-platpat.inpit.go.jp/tkk/tokujitsu/tkkt/TKKT_GM301_Detailed.action
ま、研究では近年の深層崩壊でも使われていますので、研究やデータマイニングツールとして使えそうです。

フローは単純ですので、単コアでの実装は容易です。dependency(「整合度」と訳されている)の計算部分も、R のパッケージに関数として組まれていますので、特に悩む必要はありません。一晩で(といってもかなり遅くまでかかりましたが)実装は終わりました。

で、計算!

遅い!
for で 118万回ループさせた dependency の計算でしたが、完走するまで11.5時間かかりました。

R の for 文 は遅くなることで有名なようでしたが、本当に遅かった。
dependency を算出する関数がベクトルを受け付けてくれませんので、仕方ありません。ま、for ループを使っておけば、次の並列化が楽になるだろうという目論見もあったわけですが。

やはり並列化・高速化が必要でしょう。
続く。

**************************************
20170623追記

dependency を算出する関数の引数にリストから値を代入する関数を作り、それを apply  lapply で呼んでやることはできました。が、新たな問題も発生。こちらに関しては後日。


2017年6月18日日曜日

Rough Sets with R

R でラフ集合を扱っていました。

ラフ集合は初めてです。統計かな?と思っていましたが、集合論でしょうか。難しい理論や数式はなく、数学というよりは国語の問題を扱っている感覚でした。

R でラフ集合を扱えるパッケージは以下の2種類のようです。
・RoughSetKnowledgeReduction
・RoughSets

マニュアルの薄い前者のほうから試用してみました。
が、計算遅すぎ。数千のテストデータのルール抽出計算が1日で終わりません。シングルコアで頑張っていたようですが、2日目にオーバーフローを吐き出し止まっていました。

次に、後者を試用。
こちらはリファレンスを追いながら、なんとか1日で上近似・下近似・極小条件を出すところまで到達。こちらもシングルコアでしたが、C++ を利用しているのか計算が早い。同じ数千のデータでも、読み込み~計算~結果の書き出しまで20秒ぐらいでした(ルール抽出は行っていませんので負荷が異なりますが)。こちらをメインに触っていきましょう。

R も 並列化、GPU利用などによる高速化に着手されているようですが、全体的にはこれからのようです。Web・Twitter などのビッグデータを収集・分析するようなことも始められていますので、今後、適用は進むでしょう。

RoughSet のいくつかの計算は、並列化・高速化の組み込みに関して有利だと思います。今後に期待しましょう。


2017年6月13日火曜日

安全衛生教育

他チームから、ほぼ新人くんがやってきました。

「作業内容を変更したとき」に該当しますので、安全衛生教育を実施し、現場に出る際の心構えと要点を学んでもらいました。

建設業の場合、職長や安全衛生責任者の選任も絡んできます。法令則のみでなく通達の内容に沿って教育を実施する必要があるのですが、関連個所をその順に漏れなく追う必要があります。単純ですが、面倒。個人レベルで見逃しを出さない管理方法はないものでしょうか?(今年の能力向上に関する通達は、危なく見逃しかけていました。)

先日、図書館で以下の図書を見かけました。関連項目毎に法・令・則・通達が整理・記載されています。出版が3年前で少し古いのですが、このような形式であれば管理しやすいですね。

笠原秀樹「建設業の安全衛生法令用語検索エンジン 用語の意味、適用条文、公示、告示、通達がわかる!」日刊建設通信新聞社

このような整理された情報の閲覧を Web 上で実施できればよいと思います。更新はプッシュ通知で。
労働安全衛生コンサルタントの皆さんが作ってくれないでしょうか?


2017年6月12日月曜日

VPN-RD 接続のバッチ処理

Windows10になってから1手増えていたVPN接続。
毎回、VPN接続→リモートデスクトップ接続・切断→VPN切断をやっておりますと、PCに無駄な作業をさせられているように感じてきました。

で、バッチ化。

①メモ帳で以下を記載し.batで保存
rasdial "接続名" ID PASS
mstsc C:\Users\ユーザー名\Documents\rdpファイル
rasdial /DISCONNECT

※接続設定を済ませている状態が前提。その設定内容を黄文字の箇所に指定します。
※ここまででもOKですが、以下でスタートメニューに登録すれば、より便利。


②.batのショートカットを作り、そのリンク先にcmd.exeのありかを挿入。
C:\Windows\System32\cmd.exe /C パス付きで①.batファイル

※ショートカットを右クリック-プロパティでリンク先が出てきます。
※cmd.exeのショートカットに、.batのありかを指定する形になります。

③右クリックでスタートにピン止め


ついでに、1行目だけのVPN接続、3行目だけの切断のショートカットも作成し、登録しておきました。
ちょっとしたことですが、かなり便利になりました。

******************************
20170625追記
VAIO Win10 Pro ではUWP版のリモートデスクトップを使っていたのですが、接続がすぐに途切れることが多く困っていました。今回、YOGA Win10 Home では上記の通りデスクトップ版に切り替えています。今のところ、安定して接続できています。