本記事では、データのメモリ使用量が行数や列数から受ける影響を調べるため、テスト用データをSpotfireへ取り込んだ際のメモリ使用量を計測します。
検証にあたっては、データエンジンのメモリ使用量およびSpotfireアプリケーションのメモリ使用量の2つの指標を実測しました。Spotfireアプリケーションのメモリ使用量は、データエンジンのメモリ使用量とヒープメモリの2つの要素から構成されています。分析対象データは高速処理のためにデータエンジン内へ格納され、画面表示やグラフの描画などの処理にはヒープメモリが使用されます。
なお、実際のメモリ使用量はデータ型やユニークな値の数(カーディナリティ)などによって異なるため、本結果はあくまで参考値としてご活用ください。
動作検証環境
- Spotfire Analyst 14.0.10 HF-046
- Windows 11 25H2(Intel Core i7-12700H / 32GB RAM)
計測用データ
テスト用データの作成には、以下のPythonコードを使用しています。ランダムな整数(乱数)を生成し、SBDF形式のファイルとして出力しました。
import spotfire.sbdf as sb
import pandas as pd
import numpy as np
# テスト用データを生成するための関数
def sbdf(row=1,col=1):
df = pd.DataFrame(np.random.randint(0,100000,size=(row, col)), columns=['x{}'.format(i) for i in range(1, col+1)])
df.insert(0, 'id', range(len(df)))
sb.export_data(df, "D:/data/" + '{}x{}.sbdf'.format(row,col)) # 出力先フォルダ
row=10000 # 行数
col=1000 # 列数
sbdf(row,col) # テスト用データを生成
計測方法
正確な数値を測定するため、事前に「推奨事項のバックグラウンド計算」を無効化した上で、以下の手順で計測を行います。
- 事前設定:[ツール] ⇒ [オプション] の「文書」ページにて、「推奨事項のバックグラウンド計算を許可する」オプションを「いいえ」に設定する。
- 環境のクリア:テストを行うたびに、先にAnalystを一旦終了し、再度起動する。
- データのインポート:SBDF形式のデータを取り込む。
- データ計測:取り込み後、その他の操作は行わずに、タスクマネージャーからアプリケーションのメモリ使用量を取得する。その後にAnalystの画面からデータエンジンのメモリ使用量を取得する。
「おおよそのテーブルサイズ」はデータエンジンのメモリ使用量を指しており、Analystの「ヘルプ」⇒「診断とロギングのサポート」画面から取得しています。
アプリケーションのメモリ使用量はタスクマネージャーの「メモリ(アクティブなプライベートワーキングセット)」列から取得しています。なお、計測対象はSpotfireのメインプロセス「Spotfire.Dxp.exe」のみとし、サブプロセスは対象外としています。
データサイズ毎のメモリ使用量の計測値
「横持ち」(列数が多いデータ)と「縦持ち」(行数が多いデータ)のそれぞれをSpotfireへ取り込んだ際の、メモリ使用量の実測値は以下の通りです。
横持ちデータ
| 行数 | 列数 | データエンジンのメモリ使用量 (おおよそのテーブルサイズ) | アプリケーションのメモリ使用量 (アクティブなプライベートワーキングセット) |
|---|---|---|---|
| 10,000 | 1,000 | 39 MB | 480 MB |
| 10,000 | 2,000 | 77 MB | 586 MB |
| 10,000 | 4,000 | 154 MB | 838 MB |
| 10,000 | 8,000 | 308 MB | 1,282 MB |
| 10,000 | 16,000 | 615 MB | 2,283 MB |
| 10,000 | 32,000 | 1.2 GB | 4,161 MB |
縦持ちデータ
| 行数 | 列数 | データエンジンのメモリ使用量 (おおよそのテーブルサイズ) | アプリケーションのメモリ使用量 (アクティブなプライベートワーキングセット) |
|---|---|---|---|
| 10,000 | 1,000 | 39 MB | 480 MB |
| 20,000 | 1,000 | 77 MB | 429 MB |
| 40,000 | 1,000 | 153 MB | 506 MB |
| 80,000 | 1,000 | 306 MB | 663 MB |
| 160,000 | 1,000 | 612 MB | 997 MB |
| 320,000 | 1,000 | 1.2 GB | 1,633 MB |
結論
「横持ち」と「縦持ち」のデータ構造において、データエンジンのメモリ使用量に大きな差はありません。
この実測値は、データ型や値の数から算出した理論値(下記)とほぼ一致しており、値の数に比例する関係となっています。
10000 * 1000 * 4 = 38.15 MB ※整数(int32)のサイズは4バイトです。
一方で、アプリケーションのメモリ使用量については、横持ちデータにおいて列数が増えるほど、計測値が顕著に増大する傾向が見られます。
特に、総セル数3.2億件の同等のデータ量で比較した場合、10,000行×32,000列の横持ちデータは4,161MBを消費し、320,000行×1,000列の縦持ちデータが消費する1,633MBの約2.5倍に達しています。