QlikViewのデータ圧縮はファイルの種類によって異なる?で書いたQlikViewのデータロード実験で面白いことに気づいた。
QlikViewで大量のデータをロードするときに、一定のロード件数に達すると爆発する(笑:そうとしか言えないもので)ということだ。
QlikViewのリロード中の爆発
QlikViewのリロード処理の最中に物理メモリの上限に達すると、一気にスローダウンし、ほとんど止まったような状態になる。
おそらく、仮想メモリへのスワップが発生しているのだろうが、QlikViewではこのスワップはご法度で、半分死んでいる状態だから、スワップしないだけの物理メモリを積んでおかなければいけない。
実際に経験した爆発とは以下のとおり。
LET vCustomerCnt =1000000;
LET vProductCnt = 10000;
LET vTranCnt = 100000000;
Customer:
LOAD RowNo() as customer_id,
Hash128(RowNo()) as customer_name
AutoGenerate $(vCustomerCnt);
Product:
LOAD RowNo() as product_id,
'Product_' & RowNo() as product_name
AutoGenerate $(vProductCnt);
LET vRap = Now();
Transaction:
LOAD RowNo() as tran_id,
Ceil(Rand()*$(vCustomerCnt)) as customer_id,
Ceil(Rand()*$(vProductCnt)) as product_id,
Mod(Floor(pow(Rand(),2)),3)+1 as unit,
Ceil(Sqrt(Rand()*10000000)) as amount
AutoGenerate $(vTranCnt);
LET vRap1 = interval(Now() - '$(vRap)');
STORE Transaction into Transaction.qvd(qvd);
LET vRap2 = interval(Now() - '$(vRap)');
DROP Table Transaction;
Transaction:
LOAD * From Transaction.qvd(qvd);
LET vRap3 = interval(Now() - '$(vRap)');
上記のスクリプトではCustomer,Product,Transactionのデータを作成し、TransactionをQVDファイルとしてStore、その後、StoreされたQVDを読み込むという内容。Transactionの件数は100,000,000件である。
一旦、4GBくらいに凹んだところがStoreしてDropしたところ、その後順調にロードしていたが急激に使用メモリが増える箇所がある。
100,000,000件中、72,000,000件を超える辺りである。しかも何度やっても同じところで爆発のように使用量が増える。
ロードが終わると4GB程度に落ち着く。
爆発時はTransactionのロード前の+6GBくらいになっている。
QVDのファイルサイズはTransaction.qvdで1.6GB程度だから、4倍程度のメモリを消費していることになる。
そうか、QVDのファイルサイズ以上のメモリ(しかも4倍も)を消費することがあるんだな。
これはQVWのファイルをメモリに展開したときに消費されるメモリに似ているね。
その他のロード方法ではどうなるか
QVDへのStoreではなく、CSVにStoreし、CSVからロードすると、爆発は1GB強小さくなる。
これは不思議だ。
さらに、Storeせずに、一旦できたTransactionテーブルからResidentでLOADしてみると、こうなる。
Residentでロードした場合は爆発は起きない。かなり安定したロード処理が行われている。
以上から言えることは
"ファイルからロードする時には一定のサイズを超えると爆発が起きることがある"
"QVDからロードする時が爆発は一番大きい"
"爆発を考えると、QVDのファイルサイズの消費メモリを予め考慮しておいたほうがいい"
ホントかよ。
の結果ではあるんだけど。