PDF出力の高速化
採点済み答案のPDF出力は、一括採点の重要な機能です。 しかし、答案枚数が多いと出力に時間がかかるという課題がありました。 本記事では、PDF出力を高速化した取り組みについて紹介します。
課題:大量の答案を処理する時間
採点済み答案のPDF出力では、以下の処理を答案1枚ごとに行います。
- 元の答案画像を読み込む
- 採点記号(丸・バツ・三角)を描画
- 点数を描画
- アノテーション(線・四角・テキストなど)を描画
- PDFページとして埋め込む
1枚あたりの処理時間は短くても、 40人×2ページの答案を処理すると80回、 100人のテストなら数百回の繰り返しになります。
従来の実装では、これらの処理を1枚ずつ順番に行っていました。 つまり、1枚目の処理が終わるまで2枚目は待機、 2枚目が終わるまで3枚目は待機...という形です。
この方式では、答案の枚数に比例して処理時間が長くなります。 大規模なテストでは、PDF出力だけで数分かかることもありました。
解決策:並列処理の導入
今回のアップデートでは、複数の答案を同時に処理する方式に変更しました。
具体的には、「Canvas Pool」という仕組みを導入しています。 Canvasとは、画像を描画するための作業領域のようなものです。 複数のCanvasを用意しておき、それぞれで異なる答案を同時に処理します。
従来(順次処理)
答案1 → 答案2 → 答案3 → 答案4 → ...
改善後(並列処理・4並列の例)
答案1 → 答案5 → 答案9 → ...
答案2 → 答案6 → 答案10 → ...
答案3 → 答案7 → 答案11 → ...
答案4 → 答案8 → 答案12 → ...
最大8つの答案を同時に処理できるため、 理想的な条件では処理時間を大幅に短縮できます。
並列数の調整
並列処理は高速ですが、同時に多くの処理を行うとパソコンに負荷がかかります。 そのため、ユーザーが並列数を1〜8の範囲で調整できるようにしました。
高性能なパソコンでは8並列で高速処理、 古いパソコンでは2〜4並列で安定処理、といった使い分けが可能です。
UIの改善
処理の高速化に合わせて、ユーザーインターフェースも改善しました。
進捗表示の刷新
PDF出力中の画面を刷新し、処理の進捗がより分かりやすくなりました。 全体の進捗に加えて、現在処理中のページ数も表示されます。
キャンセル機能の追加
新たにキャンセル機能を追加しました。 PDF出力を開始した後でも、途中で処理を中断できます。
「設定を間違えた」「別の作業を先にしたい」といった場面で、 出力完了を待たずに作業を中断できるようになりました。
その他の改善
点数印字位置の拡張
点数を印字する位置を、9方向から選択できるようになりました。
答案のレイアウトに合わせて、最適な位置に点数を配置できます。
点数サイズの拡大
点数の表示サイズの上限を、48から200に拡大しました。 大きな答案用紙でも、見やすいサイズで点数を印字できます。
これらの改善により、採点済み答案のPDF出力がより快適になりました。 今後も処理速度の改善に取り組んでいきます。