LoginSignup
6
8

More than 5 years have passed since last update.

Qlik Sense Desktop × Surface Pro3で10億件のデータを試してみる

Last updated at Posted at 2015-12-20

概要

Tableau × R で時系列分析をやってみるにインスパイアされました。
といっても、Rとの連携に関しては、既にQlik SenseでR/Shinyを使う(実験段階)という記事でも触れているので、ここでは大量データをオンメモリーで本当に処理できるかどうか、を試してみます。
具体的には、適度にカーディナリティの低いデータを用いて、Surface Pro3のスペックで10億件のレコードを処理するのにどれぐらい時間がかかるのか、ということを試します。

実験1

詳細について

上でも少し書いていますが、QlikView/Qlik Senseは、カーディナリティが低いデータが非常に得意です。カーディナリティが高いデータについては、特別に不得意ということは無いのですが、カーディナリティが低い場合の他のツールとの差が圧倒的だと思っています。(きちんと試した訳ではないのですが…)
そこで、今回は次のようなプログラムでダミーデータを生成し、まず1億件のデータの処理がどれぐらいでできるのか、を調べます。

Program.cs
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に従ってデータを追加します。
test01.png
test02.png
test03.png
test04.png
test05.png
約1GB、1億行の単純なカンマ区切りファイルですが、読み込みには1分41秒かかりました。
このデータの読み込みは、新しいデータをQlik Senseのファイルに取り込む際に必要なもので、一度取り込んだデータを処理する場合=保存されたファイルを単に開く場合には不要です。
一般的には、バッチ処理等でサーバーで自動的にデータロードさせることが多いですが、Qlik Sense Desktopの場合、勝手にリロードする機能は無い為、都度必要に応じて自分でデータロードする必要があります。
ちなみに、この時のマシン負荷は図の通りです。(SurfacePro3/corei5/メモリ8GBモデル)
test06.png

アプリづくり

GUIに従って、ピボットテーブルを作ってみます。
test07.png
test08.png
ピボットテーブルを表示したときの、マシン負荷も載せています。ほとんど負荷がかかっていませんが、計算はされています。計算にはほとんど時間がかかっていません。
この状態だと、区分2~区分3が閉じられているので、展開してみます。
test09.png
test10.png
例によって、ほとんど負荷はかかりません。
ちなみに、このときQlik Sense Desktopのプロセスは約1.4GB程度メモリを消費していました。

ファイルサイズ

Qlik Senseでは、データとUIコンポーネントをセットで「アプリ」として保存します。qvfというファイルになります。
test11.png
元々のサイズが約1GBなので、圧縮された状態になっています。
このあたりの詳細はここでは説明しませんが、超正規化とか連想技術とかで検索すると、何かが出てくると思います。

実験2

このカーディナリティの高さだと、Qlik Senseの限界を知ることは全くできませんでした。
データの量を10倍に増やして、10億件にしてみます。ついでに、カラムも一つ増やします。

データロード

データをロードするスクリプトを編集して、ダミーデータをもっと増やします。
test12.png
test13.png
元のスクリプトは単にデータを読み込んでいるだけですが、適当な計算処理や日付を付加する謎の処理を付け加えました。
データロード中の様子です。さすがに計算処理を付け加えると、かなり重くなるようです。
CPU負荷が逆に100%ではなくなってしまったのが面白いところでしょうか。
test14.png
test15.png
test16.png
一時間ちょっとかかりました。
データをロードした後、Qlik Senseの中で最適化する処理や、ファイルを保存する処理では負荷が上がっています。
また、メモリの使用量も増えました。増えましたと言っても、1GB弱ですが。

アプリづくり

データロード後、アプリを開こうとすると、アプリを開くまでに20秒くらい?かかります。
途中でメモリが増えたり減ったりしますが、エラーは発生しませんでした。
test17.png
QlikViewnだと、ここでメモリが増えすぎて開けない、ということがよくありました。

test18.png
test19.png
test21.png
test20.png
ピボットの軸に日付をつけたりしています。操作毎に15秒ぐらいかかります。

ちなみに、メモリの使用量は2.4GBぐらいでした。

ファイルサイズ

画像がありませんが、1.5GBになりました。日付をつけて10倍にしても、こんなもので済みます。

まとめ

・Surface Pro3(corei5/8GB)レベルの端末であれば、10億件でも特にストレスなく処理できました。
・カーディナリティを高くした場合は、また別途機会があれば試します。

6
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
8