Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
フレームワークの「恩恵」と「制約」を見極めたバッチ処理の高速化
Search
Kazuya Umeki
April 11, 2026
Technology
11
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
フレームワークの「恩恵」と「制約」を見極めたバッチ処理の高速化
Kazuya Umeki
April 11, 2026
More Decks by Kazuya Umeki
See All by Kazuya Umeki
UI実装者が書いたシナリオだからこそ、 意味を持つk6負荷試験
umekikazuya
0
22
【golang】構造体のフィールド宣言順序は パフォーマンスにどう影響するか?
umekikazuya
0
3
厚いFW・ORMの誘惑と技術選定のリアル
umekikazuya
0
3
計算量考えてます?
umekikazuya
0
17
Other Decks in Technology
See All in Technology
hackers_champloo_2026_tidb
makocchi
0
170
Kiro Crewで「みのるん式」仕事術やってみた
minorun365
PRO
3
650
AI時代のPRレビューにどう向き合うか?
kairim0
1
240
脆弱性診断って、何をしているの? 〜弱点を見つけて、会社の改善につなげるまで〜
keeg
0
930
日本語に強いオープンな大規模言語モデル「LLM-jp」
odashi
5
1.2k
CTO Night|NotionのAIエージェントとFDE
kzkhykw1991
0
230
DevelopersIO 2026 知識の地図を描く ─ オントロジーとは何か?
ishikawa_satoru
1
1.7k
古い指輪から広がった JAVA コミュニティ とのつながり
yamad
0
130
Tofu-Controller lightning talk @ Containerday 2026
gionn
0
120
ストレスなくAIと付き合いたい!こんなときどうしてる?
namiki64
4
610
Optunaの最新リリースv5.0について
pfn
PRO
0
120
アウトプット初心者、半年間のふりかえり
4o1sobblue
0
440
Featured
See All Featured
Balancing Empowerment & Direction
lara
6
1.3k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.3k
Believing is Seeing
oripsolob
1
250
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
570
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3.1k
Thoughts on Productivity
jonyablonski
76
5.4k
Claude Code のすすめ
schroneko
67
230k
Building an army of robots
kneath
307
47k
Testing 201, or: Great Expectations
jmmastey
46
8.3k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
Transcript
45min → 20sec フレームワークの「恩恵」と「制約」を 見極めたバッチ処理の高速化 梅木和弥 PHP Conference Odawara 2026
2026/4/11(土) / おだわら市民交流センター UMECO
Today’s goal. フレームワークの「恩恵」と「制約」を見極めた線引きが大事
Agenda 1 概要 2 既存実装の課題点 3 課題解決への作戦検討 4 改善フェーズ 5
結果サマリー
概要 どんなシステム?どんなプロジェクト? システム 4,000~5,000人規模の企業向けイントラネット(社内ポータル) 技術スタック Drupal: ECS, Aurora, S3 プロジェクト概要
クライアント案件 / 新規開発 / 初期リリースまで約 2 年半 / 10年運用を見据えている Company Name
概要 バッチ処理について 社員をグループに所属登録させるバッチ処理 日次データ同期バッチ CSV → DB CSVのレコード数: 約40,000件 社員数:
4,000~5,000人、グループ数: 1000未満 実行時間: 約45分間 バッチ処理の速度改善と品質、保守性が求められていた CSV data “group_id”,”employee_no” “42”,”EMP_NO_001” “42,”EMP_NO_002” “105”,”EMP_NO_001” “105”,”EMP004” ... (約4万行)
概要 既存のバッチ処理のロジックについて ①. S3から取得したCSVファイルを1行ずつ読み込む ②. グループと社員がDB上に存在するか? No Yes 監査用ログ出力 グループに社員を所属登録
るとプルがかかた CSV data “group_id”,”emp_no” “42”,”EMP_NO_001” “42,”EMP_NO_002” “105”,”EMP_NO_001” “105”,”EMP004” ... (約4万行)
課題点 何故45分かかる? Before N+1問題 + 洗い替え方式 $this→deleteAll(); // DELETE foreach
($records as $r) { $group = $groupRepo->load($r[‘g_id’]); // SELECT $emp = $userRepo→loadByEmpNo($r[‘emp_no’]); // SELECT if (!$group->getMember($emp)) { $group->addMember($emp); $group->save(); // INSERT / UPDATE } 4万行 × 毎行3回のDBアクセス = 約12万クエリ }
作戦 時短 x 保守性 x 工数 Option A Option B
FWのAPIで書く 素のPHP+SQLで書く 遅い(45分) 保守性がネック Option C 計算は言語レイヤ 永続化はFW ✓ SELECTED
リファクタリング Phase 1 メモ化とデータの正規化 Phase 2 差分更新の実装
Phase 1 メモ化とデータの正規化 After foreach // 1. ($records as メモ化
$rows $gCache[$gID] ??= = $r) { [ $gRepo->load($r[‘gID’]); // 未ロードの場合のみDBへアクセス 42 ??= => [ 101 => true, 102 => true $empCache[$empNo] $empRepo→loadByEmpNo($r[‘empNo’]); 105 // 2. if ($gCache[$gID] => [ 103 => true ], 軽量ハッシュマップの構築 $empNo ] = && $empCache[$empNo]) { $emp_cache[$empNo]; グループ42 → ユーザー101, 102 を所属させたい $rows[$gID][$empNO] = TRUE; // スカラー値(TRUE)で } ], O(1) 探索用の構造を作る グループ105 → ユーザー103 を所属させたい } return [$rows, $gCache, $empCache]; // キャッシュデータ生成のみを行う関数
Phase 2 差分更新を導入、不要なDELETEとINSERTを行わない。 After private function diff($currentIDs, $seletetedIDs): array {
$add = $remove = []; // 所属登録処理を行う対象、脱退処理を行う対象を計算する(差分) foreach ($seletetedIDs as $id => $value) { // isset() のハッシュキー探索で O(1) で処理 if (!isset($currentIDs[$id])) { $add[] = $id; } } } foreach ($currentIDs as $id => $value) { if (!isset($seletetedIDs[$id])) { $remove[] = $id; } } return [$add, $remove];
結果サマリー インフラ変更なし。コードだけで達成。 Before After ※ 通常営業日想定 After ※ 大規模組織改変想定 45
min 20 sec 2 min 30 sec
まとめ 恩恵と制約を見極めることが大事。その上で線引きを行いましょう FWは「使う・使わない」の二元論ではありません。 アルゴリズムやデザインパターンを積極採用 FW外の箇所ではアルゴリズムやデザインパターンを積極採用 Company Name
ご清聴ありがとうございました。 梅木和弥