🪟 Dataflow スライディングウィンドウ

ストリーミングデータを時間枠で区切って処理する仕組み

📖 スライディングウィンドウとは

スライディングウィンドウは、連続的に到着するストリーミングデータを、重複する時間枠に分割して集計する手法です。

1
2
3
4
5
6
7
8
↓ 3要素のウィンドウが1つずつスライド
[1,2,3]
[2,3,4]
[3,4,5]
# Apache Beam (Dataflow) の例 from apache_beam import WindowInto from apache_beam.transforms.window import SlidingWindows events | WindowInto( SlidingWindows( size=60, # ウィンドウサイズ: 60秒 period=30 # スライド間隔: 30秒ごとに新しいウィンドウ ) ) | beam.CombinePerKey(sum)
🔑 重要な特徴:

📊 ウィンドウの動作イメージ

例: ウィンドウサイズ60秒、スライド間隔30秒

0秒
30秒
60秒
90秒
120秒
150秒
E1
E2
E3
E4
E5
E6
E7
E8
Window 1
0s
60s
Window 2
30s
90s
Window 3
60s
120s
💡 データの重複処理:
イベントE3は Window 1 と Window 2 の両方に含まれます。
イベントE5は Window 2 と Window 3 の両方に含まれます。

🔄 Dataflowの主なウィンドウタイプ

🪟 Fixed Window (固定ウィンドウ)

W1 W2 W3 W4

重複なし、各イベントは1つのウィンドウにのみ属する

🎯 Sliding Window (スライディング)

W1 W2 W3

重複あり、各イベントは複数のウィンドウに属する可能性

⏱️ Session Window (セッション)

Session1 S2 S3

ギャップベース、一定時間アクティビティがないとウィンドウを閉じる

🌍 Global Window (グローバル)

すべてのデータ

無制限、すべてのデータが1つのウィンドウに属する

🧮 同等の概念を持つアルゴリズム

1. Sliding Window Algorithm (スライディングウィンドウアルゴリズム)

分野: データ構造とアルゴリズム、競技プログラミング

概要: 配列やリストに対して固定サイズの部分範囲を移動させながら処理を行う手法

# 典型的なスライディングウィンドウアルゴリズム def max_sum_subarray(arr, k): # サイズkの部分配列の最大和を求める n = len(arr) if n < k: return None # 最初のウィンドウの和を計算 window_sum = sum(arr[:k]) max_sum = window_sum # ウィンドウをスライド for i in range(n - k): window_sum = window_sum - arr[i] + arr[i + k] max_sum = max(max_sum, window_sum) return max_sum # 例: [1, 4, 2, 10, 23, 3, 1, 0, 20] でk=4 # ウィンドウ1: [1, 4, 2, 10] → 17 # ウィンドウ2: [4, 2, 10, 23] → 39 # ウィンドウ3: [2, 10, 23, 3] → 38

✅ 共通点

  • 固定サイズの範囲を移動
  • 重複するデータを処理
  • 効率的な増分計算
  • O(n)の時間計算量

⚠️ 相違点

  • 配列 vs ストリーム
  • 静的 vs 動的
  • メモリ内 vs 分散処理
  • 同期 vs 非同期

2. Moving Average (移動平均)

分野: 統計学、時系列解析、金融工学

概要: 時系列データの一定期間の平均を、時間とともに移動させながら計算

# 単純移動平均 (SMA: Simple Moving Average) def simple_moving_average(prices, window): sma = [] for i in range(len(prices) - window + 1): window_avg = sum(prices[i:i+window]) / window sma.append(window_avg) return sma # 例: 株価の5日移動平均 prices = [100, 102, 98, 105, 110, 108, 112] sma_5 = simple_moving_average(prices, 5) # [103.0, 104.6, 106.6]
移動平均の種類 特徴 用途
SMA (単純移動平均) 全データ点が同じ重み トレンド分析、ノイズ除去
EMA (指数移動平均) 最近のデータに高い重み 反応速度重視の分析
WMA (加重移動平均) 線形的に重み付け 中期的なトレンド把握

3. TCP Sliding Window (TCPスライディングウィンドウ)

分野: ネットワークプロトコル、フロー制御

概要: 確認応答を待たずに送信できるデータ量を動的に調整

送信者のウィンドウ 送信済み 送信可能 送信不可 ACK受信後 ↓ スライド →

仕組み: 受信者の処理能力に応じてウィンドウサイズを調整し、効率的なデータ転送を実現

4. Circular Buffer / Ring Buffer (リングバッファ)

分野: データ構造、組み込みシステム、音声/映像処理

概要: 固定サイズのバッファを循環的に使用し、最新のN個のデータを保持

class CircularBuffer: def __init__(self, size): self.size = size self.buffer = [None] * size self.head = 0 self.count = 0 def add(self, item): self.buffer[self.head] = item self.head = (self.head + 1) % self.size self.count = min(self.count + 1, self.size) def get_window(self): return [self.buffer[i] for i in range(self.count)] # 最新5件のログを保持するバッファ log_buffer = CircularBuffer(5)

🎯 実際のユースケース

📊 リアルタイム分析

例: 過去1分間のWebサイトアクセス数を30秒ごとに計算

💰 金融データ処理

例: 株価の移動平均を計算してトレンドを検出

🔍 異常検知

例: サーバーメトリクスの異常な変動を検出

🎮 ゲーム・IoT

例: センサーデータの平滑化

⚖️ メリット・デメリット

✅ メリット

  • 滑らかな出力: 重複により急激な変化を緩和
  • 柔軟性: size と period を調整して最適化
  • トレンド分析: 時間的な変化を捉えやすい
  • 増分計算: 効率的な更新が可能

❌ デメリット

  • 重複処理: 同じデータを複数回処理
  • 遅延: ウィンドウが閉じるまで結果が出ない
  • リソース消費: 複数ウィンドウの管理が必要
  • 複雑性: 設定パラメータの調整が難しい

📚 まとめ

概念 適用分野 主な用途
Dataflow Sliding Window ストリーム処理 リアルタイム分析、イベント集計
Sliding Window Algorithm アルゴリズム 部分配列問題、最適化
Moving Average 統計・金融 トレンド分析、ノイズ除去
TCP Sliding Window ネットワーク フロー制御、輻輳制御
Circular Buffer データ構造 固定サイズ履歴、ストリーミング
🎓 共通の核心概念:

すべての「スライディングウィンドウ」は、固定サイズの範囲を移動させながらデータを処理するという基本原理を共有しています。この概念は、効率的な増分計算と、時間的または空間的な局所性を活用するための強力なパターンです。