概要
Tableau × R で時系列分析をやってみるにインスパイアされました。
といっても、Rとの連携に関しては、既にQlik SenseでR/Shinyを使う(実験段階)という記事でも触れているので、ここでは大量データをオンメモリーで本当に処理できるかどうか、を試してみます。
具体的には、適度にカーディナリティの低いデータを用いて、Surface Pro3のスペックで10億件のレコードを処理するのにどれぐらい時間がかかるのか、ということを試します。
実験1
詳細について
上でも少し書いていますが、QlikView/Qlik Senseは、カーディナリティが低いデータが非常に得意です。カーディナリティが高いデータについては、特別に不得意ということは無いのですが、カーディナリティが低い場合の他のツールとの差が圧倒的だと思っています。(きちんと試した訳ではないのですが…)
そこで、今回は次のようなプログラムでダミーデータを生成し、まず1億件のデータの処理がどれぐらいでできるのか、を調べます。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
StreamWriter sw = new StreamWriter(@"c:\a_test\dummy_data.txt");
var r = new Random();
sw.WriteLine("区分1,区分2,区分3,金額");
for (long i = 0; i < 100000000; i++)
{
sw.WriteLine(r.Next(5) + "," + r.Next(5) + "," + r.Next(10) + "," + 500 * r.Next(20));
}
sw.Close();
}
}
}
見てわかる通り、区分1,区分2,区分3,金額という謎の4つの項目を持ち、区分1~3は5種類、金額は20種類の離散的な値を取ります。
データロード
Qlik Senseを立ち上げ、アプリの新規作成を選び、GUIに従ってデータを追加します。
約1GB、1億行の単純なカンマ区切りファイルですが、読み込みには1分41秒かかりました。
このデータの読み込みは、新しいデータをQlik Senseのファイルに取り込む際に必要なもので、一度取り込んだデータを処理する場合=保存されたファイルを単に開く場合には不要です。
一般的には、バッチ処理等でサーバーで自動的にデータロードさせることが多いですが、Qlik Sense Desktopの場合、勝手にリロードする機能は無い為、都度必要に応じて自分でデータロードする必要があります。
ちなみに、この時のマシン負荷は図の通りです。(SurfacePro3/corei5/メモリ8GBモデル)
アプリづくり
GUIに従って、ピボットテーブルを作ってみます。
ピボットテーブルを表示したときの、マシン負荷も載せています。ほとんど負荷がかかっていませんが、計算はされています。計算にはほとんど時間がかかっていません。
この状態だと、区分2~区分3が閉じられているので、展開してみます。
例によって、ほとんど負荷はかかりません。
ちなみに、このときQlik Sense Desktopのプロセスは約1.4GB程度メモリを消費していました。
ファイルサイズ
Qlik Senseでは、データとUIコンポーネントをセットで「アプリ」として保存します。qvfというファイルになります。
元々のサイズが約1GBなので、圧縮された状態になっています。
このあたりの詳細はここでは説明しませんが、超正規化とか連想技術とかで検索すると、何かが出てくると思います。
実験2
このカーディナリティの高さだと、Qlik Senseの限界を知ることは全くできませんでした。
データの量を10倍に増やして、10億件にしてみます。ついでに、カラムも一つ増やします。
データロード
データをロードするスクリプトを編集して、ダミーデータをもっと増やします。
元のスクリプトは単にデータを読み込んでいるだけですが、適当な計算処理や日付を付加する謎の処理を付け加えました。
データロード中の様子です。さすがに計算処理を付け加えると、かなり重くなるようです。
CPU負荷が逆に100%ではなくなってしまったのが面白いところでしょうか。
一時間ちょっとかかりました。
データをロードした後、Qlik Senseの中で最適化する処理や、ファイルを保存する処理では負荷が上がっています。
また、メモリの使用量も増えました。増えましたと言っても、1GB弱ですが。
アプリづくり
データロード後、アプリを開こうとすると、アプリを開くまでに20秒くらい?かかります。
途中でメモリが増えたり減ったりしますが、エラーは発生しませんでした。
QlikViewnだと、ここでメモリが増えすぎて開けない、ということがよくありました。




ちなみに、メモリの使用量は2.4GBぐらいでした。
ファイルサイズ
画像がありませんが、1.5GBになりました。日付をつけて10倍にしても、こんなもので済みます。
まとめ
・Surface Pro3(corei5/8GB)レベルの端末であれば、10億件でも特にストレスなく処理できました。
・カーディナリティを高くした場合は、また別途機会があれば試します。