SSブログ

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。

# 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回ループあたりの処理時間は?などを意識しておかないと、かえって時間がかかることになるので注意が必要だ。

nice!(31)  コメント(0)  トラックバック(0) 
共通テーマ:仕事