大量データでもスムーズに動く工夫

月末の集計作業など、数百件のデータを効率的に処理するための設計

ページング大量データパフォーマンス同時実行制御効率化
読了時間: 8分

このトピックについて

月末の集計作業など、数百件のデータを扱う場面でも快適に動作する仕組みを実装しました。請求書サービスのAPI制限を意識しながら、効率的にデータを処理する設計です。

API制限との付き合い方

多くのクラウドサービスには、API呼び出しの制限があります。請求書サービスも例外ではなく、「1回の取得で100件まで」という制限があります。

件数制限
内容1回のリクエストで100件まで
影響大量データは複数回に分けて取得が必要
レート制限
内容1分間に一定回数まで
影響連続アクセスでエラーになる可能性
タイムアウト
内容1リクエストに30秒程度
影響重い処理は途中で切断される

自動ページング

「500件ください」とGASから指示するだけで、アプリ側で自動的に5回のやり取りを処理します。

自動ページングの流れ(500件の場合)
GASからリクエスト

「500件取得してください」

ページ1

offset=0, limit=100 → 100件取得

2秒待機

レート制限対策

ページ2〜5

同様に100件ずつ取得(各間に2秒待機)

結果をまとめて返却

合計500件をGASに返却

なぜ2秒待機するのか

API呼び出しの間に適度な待ち時間を挟むことで、サービス側に負荷をかけすぎない設計にしています。「アクセスが多すぎます」というエラーを未然に防ぎます。

必要な分だけ取得(2段階取得)

大量の伝票があっても、最初は「一覧だけ」を高速に取得し、詳細が必要なものだけ追加取得する方式を採用しています。

2段階取得の構成
ステップ1: 一覧取得

skip_details: true で明細をスキップ。ID・番号・取引先・日付のみ取得

高速(数秒)
フィルタリング

取引先名や日付で絞り込み。1000件→50件に削減

必要分だけ
ステップ2: 詳細取得

絞り込んだ50件のみ明細を取得

効果の比較

一括取得
1000件の場合全件の明細を取得
所要時間の目安2〜3分以上
2段階取得
1000件の場合絞り込み後50件だけ詳細取得
所要時間の目安30秒程度

同時実行制御

複数のAPI呼び出しを効率的に行うため、同時実行数を制御する仕組みを導入しました。

同時実行プールの動作
タスク投入

10件の詳細取得リクエストをキューに追加

同時実行

最大2件を並列で処理

完了したら次へ

1件完了するたびに次のタスクを開始

全件完了

10件すべての結果をまとめて返却

なぜ2件同時なのか

並列数を増やしすぎると、サービス側のレート制限に引っかかるリスクが高まります。2件同時は、速度と安定性のバランスが取れた設定です。

1件
速度遅い
安定性非常に高い
評価安全だが効率が悪い
2件
速度適度に速い
安定性高い
評価バランスが良い
5件以上
速度速い
安定性低い
評価レート制限のリスク大

最大件数の制限

ユーザーが「10000件取得」と指定しても、アプリ側で最大500件に制限しています。

大量データが必要な場合

500件を超えるデータが必要な場合は、期間を分割して取得することをお勧めします。

期間分割
1ヶ月ごとに取得
メリット安定して取得可能
取引先分割
取引先ごとに取得
メリット分析しやすいデータに
種類分割
請求書と納品書を分けて取得
メリット処理が軽くなる

ページング終了の判定

データ取得を繰り返すとき、「もう取得するデータがない」ことを正しく判定する必要があります。

ページング終了の判定
データ取得

100件リクエスト

結果を確認

取得件数をチェック

100件取得
まだデータがある可能性 → 次のページへ
100件未満
最後のページ → 終了

この設計で実現できること

運営側にとって

  • 安定した大量処理: API制限を意識した設計
  • 効率的なリソース利用: 必要な分だけ取得
  • タイムアウトの回避: 適切な件数制限

現場担当者にとって

  • ストレスのない操作: 大量データでも待ち時間が短い
  • 一度の操作で完結: ページングを意識する必要なし
  • 確実な結果取得: 途中で止まることがない

関連記事