QlikViewのファイル圧縮には謎が多い。
とりあえず、こんなスクリプトでデータファイルを作ってみる。
#データの作成
Customer=1,000,000件,Product=10,000件、Transaction=100,000,000件のデータをテキトーに作ってみる。
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);
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);
STORE Customer into Customer.qvd(qvd);
STORE Product into product.qvd(qvd);
STORE Transaction into Transaction.qvd(qvd);
上の方法でCSVとQVD形式でStoreするとファイルサイズはこんな感じになる。
まずはCSV
qvdにすると当然圧縮できるわけだけど、重複度にもよるが、上のスクリプトでロードして作成した場合はこれくらいに圧縮できる。
Transaction(100,000,000件)で約54%くらいにはなるね。
#データロード実験
QlikViewでのロードがテキストファイルよりQVDからロードしたほうが数倍速いと言われている。
じゃあ、数倍ってどの程度なのか。
以下のロードスクリプトでベンチマークしてみる。
因みにマシンスペックは以下のとおり
- CPU: i7-3520M (2.9GHz)
- メモリ:12GB
Customer:
LOAD *
FROM
Customer.qvd(qvd);
Product:
LOAD *
FROM
Product.qvd(qvd);
LET vRap = Now();
Transaction:
LOAD * FROM
Transaction.qvd(qvd);
LET vRap1 = interval(Now() - '$(vRap)');
QVDからロードしたほうが、3.57倍速いことになる。
#データソースがCSVとQVDの場合でファイルサイズは異なる?
今回の記事のメインはこれ。
ちょっと意外な結果なのだが、実はCSVからデータロードした場合とQVDからロードした場合でファイルサイズが異なる。
ホントかよ。
なぜ違うのかわからないが、QVDからロードするとCSVに比較して77.4%のファイルサイズになる。
何かの間違いではと思って何度もやったのだが、結果は同じ。
で、結論は..
”QVWのファイルサイズはQVDからロードしたほうが小さくなる。”
未だに信じられないけどね。