IBM SPSS Modeler ID数を絞ってのループ処理 [データサイエンス、統計モデル]
Netezzaで大量データを高速に処理できるようになり、何も考えずに数千万とか数億レコードの処理してしまう。
普通は、問題ないのだが、1レコードに対し、最終的にそのレコードが1000倍とかになってしまう場合に注意が必要だ。
つまり、1000万レコード×1000=10,000,000,000
100億レコード!
さすがに、これらのレコードを同時に扱うと、処理が終わるのに数日かかってしまう。
ここは、初心に戻り、レコード数を小さくして処理を行うのがよさそうだ。
レコード数が増える場合、計算にかかる時間が
1レコード数あたりの計算時間 × レコード数
と線形に増える場合は、あまり意味がなく、
1レコード数あたりの計算時間 × (レコード数)n乗
レコード数が増えれば、計算時間が爆発的に増えてくる処理の場合に有効となる。
(例)
id数が1000万レコードだったとする。
IBM SPSS Modeler(旧称クレメンタイン)のスクリプトで1000人単位で1万回のループを回せばOK。
この場合の注意点として、
1. あるIDの状態が他のIDに影響を与えないこと。
(与える場合は、あらかじめ独立で処理できるようにしておく。)
2. ループをたくさん回ることになるので、1回の処理に時間がかかる場合は、この方法は使えない。
この場合1万回のループを回すので、1回あたりの処理が10秒かかると仮定すると
10秒×1万回
= 100,000秒
≒ 1.16日
ということで、まるまる1日かければ、終了することになる。
レコード数を小さくして処理をする場合、1ループあたりにどれくらいのレコード数を入れるのか、1回ループあたりの処理時間は?などを意識しておかないと、かえって時間がかかることになるので注意が必要だ。
普通は、問題ないのだが、1レコードに対し、最終的にそのレコードが1000倍とかになってしまう場合に注意が必要だ。
つまり、1000万レコード×1000=10,000,000,000
100億レコード!
さすがに、これらのレコードを同時に扱うと、処理が終わるのに数日かかってしまう。
ここは、初心に戻り、レコード数を小さくして処理を行うのがよさそうだ。
レコード数が増える場合、計算にかかる時間が
1レコード数あたりの計算時間 × レコード数
と線形に増える場合は、あまり意味がなく、
1レコード数あたりの計算時間 × (レコード数)n乗
レコード数が増えれば、計算時間が爆発的に増えてくる処理の場合に有効となる。
(例)
id数が1000万レコードだったとする。
IBM SPSS Modeler(旧称クレメンタイン)のスクリプトで1000人単位で1万回のループを回せばOK。
# i = 1
# ID >= 1000 * (1 - 1) and ID < 1000 * 1
execute 'out_1'
# i >= 2 and i <= 10000
for i from 2 to 10000
set id_num.condition = "ID >= 1000 * ('$P-i' - 1) and ID < 1000 * '$P-i'"
execute 'out_2'
endfor
この場合の注意点として、
1. あるIDの状態が他のIDに影響を与えないこと。
(与える場合は、あらかじめ独立で処理できるようにしておく。)
2. ループをたくさん回ることになるので、1回の処理に時間がかかる場合は、この方法は使えない。
この場合1万回のループを回すので、1回あたりの処理が10秒かかると仮定すると
10秒×1万回
= 100,000秒
≒ 1.16日
ということで、まるまる1日かければ、終了することになる。
レコード数を小さくして処理をする場合、1ループあたりにどれくらいのレコード数を入れるのか、1回ループあたりの処理時間は?などを意識しておかないと、かえって時間がかかることになるので注意が必要だ。
コメント 0