はじめに
これまでのレッスンで、自動化の基本要素をすべて学んできました。
今回は、処理の「効率化」に焦点を当てます。
同じ結果を得るにも、処理の組み立て方次第で時間が大きく変わります:
- 10個の処理を順番に → 10分
- 10個の処理を同時に → 1分
この違いを生み出すのが、並列処理とシーケンス処理の使い分けです!
身近な例で理解する
朝食の準備
シーケンス処理(順番に)の例
1. パンを焼く(3分)
2. 焼き終わったらコーヒーを淹れる(2分)
3. 淹れ終わったら卵を焼く(3分)
合計:8分
並列処理(同時に)の例
同時にスタート:
- パンを焼く(3分)
- コーヒーを淹れる(2分)
- 卵を焼く(3分)
合計:3分(最も時間がかかる処理の時間)
5分も短縮! これが並列処理の威力です。
レストランの厨房
プロの料理人は、並列処理の達人です:
オーダー:パスタ、サラダ、スープ
並列処理:
├─ コック1:パスタを茹でる・ソース作り
├─ コック2:サラダの準備
└─ コック3:スープを温める
すべて同時に完成 → 熱々の料理を一緒に提供
もし1人で順番に作ったら、最初の料理が冷めてしまいますね。
処理方法の違い
- シーケンス処理:順番に1つずつ実行
- 並列処理:複数を同時に実行
シーケンス処理(順次処理)
シーケンス処理が必要な場面
順番が重要で、前の処理の結果を次が使う場合:
例1:銀行振込
1. 残高を確認
2. 残高が足りるか判定
3. 送金元から引き落とし
4. 送金先に入金
5. 明細を作成
※順番を変えると大変なことに!
例2:料理のレシピ
1. 野菜を切る
2. 油を熱する
3. 野菜を炒める
4. 調味料を加える
5. 皿に盛る
※順番が違うと別の料理に...
ビジネスでのシーケンス処理
承認フロー
申請書提出
↓
課長承認
↓
部長承認
↓
経理確認
↓
支払い実行
データ変換パイプライン
CSVファイル読み込み
↓
文字コード変換
↓
データクレンジング
↓
集計処理
↓
レポート生成
シーケンス処理の実装例
ファイルの段階的処理
処理フロー:
1. 元ファイルをバックアップ
2. ファイルを開く
3. データを読み込む
4. 変換処理を実行
5. 検証を行う
6. 問題なければ保存
7. 完了通知を送信
各ステップは前のステップの成功が前提
並列処理(並行処理)
並列処理が効果的な場面
お互いに依存しない、独立した処理の場合:
例1:複数サイトからの情報収集
同時に実行:
├─ サイトAから天気情報を取得
├─ サイトBから株価を取得
├─ サイトCからニュースを取得
└─ サイトDから為替を取得
すべて集まったら → ダッシュボードに表示
例2:画像の一括処理
100枚の画像に対して同時に:
├─ 画像1をリサイズ
├─ 画像2をリサイズ
├─ 画像3をリサイズ
└─ ...(10個同時に処理)
処理時間:1枚1秒 × 100枚 ÷ 10並列 = 10秒
(順次なら100秒かかる)
ビジネスでの並列処理
メール一斉送信
1000人の顧客に対して:
シーケンス処理の場合:
- 1通3秒 × 1000人 = 3000秒(50分)
並列処理の場合(10並列):
- 1000人 ÷ 10 = 100バッチ
- 3秒 × 100 = 300秒(5分)
45分の短縮!
複数システムへのデータ連携
売上データを同時に送信:
├─ 会計システムへ
├─ 在庫管理システムへ
├─ CRMシステムへ
└─ BIツールへ
各システムが独立しているため並列可能
並列処理の実装パターン
パターン1:バッチ分割
10000件のデータ処理:
1000件ずつ10個のバッチに分割
↓
10個のバッチを同時処理:
├─ バッチ1(1-1000)
├─ バッチ2(1001-2000)
├─ バッチ3(2001-3000)
└─ ...
すべて完了したら結果を統合
パターン2:タスク別並列化
月次レポート作成を並列化:
同時に実行:
├─ 売上データ集計
├─ 在庫データ集計
├─ 顧客データ集計
└─ コストデータ集計
↓
すべて完了後:
レポートに統合
並列処理の効果
- 処理時間の大幅短縮
- リソースの有効活用
- レスポンスの向上
- スケーラビリティの確保
並列とシーケンスの組み合わせ
実践的な組み合わせパターン
現実の業務では、両者を組み合わせることが多いです:
パターン1:前処理 → 並列 → 後処理
1. データベースから対象データを取得(シーケンス)
↓
2. データを10個のグループに分けて同時処理(並列)
├─ グループ1の処理
├─ グループ2の処理
└─ ...
↓
3. 結果を統合してレポート作成(シーケンス)
パターン2:条件による切り替え
ファイル処理:
もしファイル数が10個以下なら:
→ シーケンス処理(シンプルに)
そうでなければ:
→ 並列処理(高速化優先)
実例:ECサイトの注文処理
注文受付
↓
【シーケンス処理】
1. 注文内容の検証
2. 在庫の確認
3. 在庫の引き当て
4. 決済処理
↓
【並列処理】同時に実行
├─ 倉庫に出荷指示
├─ 顧客に確認メール
├─ 売上データ更新
└─ ポイント付与
↓
【シーケンス処理】
5. 処理完了の記録
実例:バックアップとレポート作成
深夜のバッチ処理:
【並列処理】各システムのバックアップ
├─ データベースAのバックアップ
├─ データベースBのバックアップ
├─ ファイルサーバーのバックアップ
└─ 設定ファイルのバックアップ
↓
【シーケンス処理】バックアップ完了後
1. バックアップの整合性チェック
2. 古いバックアップの削除
3. バックアップレポート作成
4. 管理者へ通知
依存関係の管理
依存関係とは
「Aが終わらないとBができない」という関係:
例:Webサイト更新
1. 新しい画像をアップロード
2. HTMLファイルを更新(画像パスを含む)
3. キャッシュをクリア
※1が終わる前に2を実行すると、画像が表示されない
依存関係の可視化
タスクA ─→ タスクD
↗
タスクB ─→ タスクE → タスクF
↘
タスクC ─→ タスクG
並列可能:A, B, C(お互いに依存しない)
待機必要:D(Aの完了待ち)、E(Bの完了待ち)
実践例:データ分析パイプライン
【第1段階】データ収集(並列)
├─ 売上DB から抽出
├─ 顧客DB から抽出
└─ 商品DB から抽出
↓
【第2段階】データ結合(シーケンス)
すべてのデータが揃ってから結合
↓
【第3段階】分析処理(並列)
├─ 地域別分析
├─ 商品別分析
├─ 時系列分析
└─ 顧客セグメント分析
↓
【第4段階】レポート生成(シーケンス)
すべての分析結果を統合
処理方式を選ぶ基準
シーケンス処理を選ぶべき場合
✅ 順序が重要 ✅ 前の結果を次が使う ✅ リソースが限られている ✅ エラー時の原因特定が重要 ✅ トランザクション処理
並列処理を選ぶべき場合
✅ 処理が独立している ✅ 大量のデータがある ✅ 処理時間を短縮したい ✅ 各処理の負荷が軽い ✅ リアルタイム性が必要
判断フローチャート
処理は独立している?
↓No ↓Yes
シーケンス 処理数は多い?
↓No ↓Yes
シーケンス 並列処理
パフォーマンスの考慮点
並列数の最適化
❌ 並列数が少なすぎる:
- 2並列で1000件 → 遅い
❌ 並列数が多すぎる:
- 1000並列で1000件 → システムが過負荷
✅ 適切な並列数:
- 10-20並列で1000件 → 最適なバランス
リソース管理
利用可能なリソースを確認:
- CPU使用率
- メモリ使用量
- ネットワーク帯域
- API制限
リソースに応じて並列数を調整
実測による最適化
テスト実行:
- 5並列:60秒
- 10並列:35秒
- 20並列:30秒
- 50並列:45秒(逆に遅くなった)
→ 20並列が最適
実装時の注意点
1. エラーハンドリング
シーケンス処理の場合
各ステップでエラーチェック:
1. 処理A実行
→ 失敗したら中断
2. 処理B実行
→ 失敗したらAを戻して中断
並列処理の場合
個別にエラー管理:
├─ 処理1:成功
├─ 処理2:失敗 → 記録して続行
├─ 処理3:成功
└─ 処理4:成功
最後に失敗分だけ再処理
2. 進捗管理
並列処理の進捗表示:
処理中:[####......] 40% (400/1000完了)
個別状態:
- バッチ1:完了
- バッチ2:処理中
- バッチ3:待機中
- バッチ4:エラー(再試行中)
3. リトライ戦略
並列処理でのリトライ:
- 個別にリトライ(他に影響しない)
- 最大3回まで
- 指数バックオフ(1秒→2秒→4秒)
今日のまとめ
処理方式の使い分け
- シーケンス処理:順序が大切な時に使う
- 並列処理:独立した処理を高速化
- 多くの場合は両者の組み合わせが最適
- 依存関係を明確にして設計
- パフォーマンスは実測して最適化
次回予告
次のレッスンでは、「エラー処理:失敗しても大丈夫な仕組み」を学びます。
- エラーの種類と対処法
- リトライとフォールバック
- エラー通知とログ
- 自己修復する自動化
どんなに完璧な自動化も、エラーは必ず発生します。それを前提とした設計方法を学びましょう!
チャレンジ問題
問題1:処理方式を選ぼう
以下の処理にシーケンス/並列のどちらが適切か選んでください:
- 1000枚の写真のサムネイル作成
- ユーザー登録(メール確認→DB登録→ウェルカムメール)
- 10個のWebサイトから最新ニュース取得
- 給与計算(勤怠集計→控除計算→振込データ作成)
答えを見る
- 並列処理:各画像は独立して処理可能
- シーケンス処理:順番に依存関係がある
- 並列処理:各サイトは独立している
- シーケンス処理:前の計算結果を次が使用
問題2:最適な組み合わせを設計
「複数店舗の月次売上レポート作成」の処理フローを、並列とシーケンスを組み合わせて設計してください。
設計例を見る
【第1段階】店舗別データ収集(並列)
├─ 東京店のデータ取得
├─ 大阪店のデータ取得
├─ 名古屋店のデータ取得
└─ 福岡店のデータ取得
↓
【第2段階】店舗別集計(並列)
├─ 東京店の集計処理
├─ 大阪店の集計処理
├─ 名古屋店の集計処理
└─ 福岡店の集計処理
↓
【第3段階】全体処理(シーケンス)
1. 全店舗データの統合
2. 全社合計の計算
3. 前年同月比の計算
4. グラフ作成
↓
【第4段階】配信(並列)
├─ 役員へメール送信
├─ 各店長へメール送信
├─ 社内ポータルへアップロード
└─ Slackへ通知
問題3:ボトルネックを見つけよう
以下の処理フローのボトルネックを特定し、改善案を提案してください:
現在のフロー(すべてシーケンス):
1. データベースから1万件取得(10秒)
2. 各レコードを1件ずつ処理(1件0.1秒 = 1000秒)
3. 結果をファイルに書き込み(5秒)
合計:1015秒
改善案を見る
ボトルネック:ステップ2の逐次処理(1000秒)
改善案:
1. データベースから1万件取得(10秒)※そのまま
↓
2. 10並列で処理(変更点)
- 1万件を1000件×10グループに分割
- 各グループを並列処理
- 1000件×0.1秒 = 100秒
↓
3. 結果をファイルに書き込み(5秒)※そのまま
改善後の合計:115秒(約9分の1に短縮!)
さらなる改善:
- データ取得も分割して並列化
- 書き込みをバッファリング
- より多くの並列数を検討
処理の効率化は、自動化の真価を発揮する重要な要素です。適切な使い分けで、驚くほどの時間短縮が可能になります!