📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
| 695行目: | 695行目: | ||
== 大量データの高速処理 == | == 大量データの高速処理 == | ||
==== 使用例 : 分割処理なし・ストリーミング処理なし ==== | |||
以下の例では、100万行のデータを生成して、Excelファイルに高速で書き込んでいる。<br> | 以下の例では、100万行のデータを生成して、Excelファイルに高速で書き込んでいる。<br> | ||
<br> | <br> | ||
| 779行目: | 780行目: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | |||
==== 使用例 : 分割処理 ==== | |||
以下の例では、メモリ使用量を抑えつつ大量のデータを効率的に処理している。<br> | |||
また、メモリに制約のあるシステムで動作させる場合にも有効である。<br> | |||
<br> | |||
* メモリ使用量の削減 | |||
*: 1度に全データを生成せずに、小さなバッチで処理するため、メモリ使用量を抑えることができる。 | |||
* 柔軟性 | |||
*: バッチサイズを調整することにより、様々なシステム環境に対応できる。 | |||
<br> | |||
<u>※注意</u><br> | |||
* <u>バッチサイズの選択</u> | |||
*: <u>システムのメモリ容量とパフォーマンスを考慮して適切なバッチサイズを選択する必要がある。</u> | |||
* <u>処理時間</u> | |||
*: <u>全データを1度に処理する場合と比較して、若干処理時間が増加する可能性がある。</u> | |||
<br> | |||
<syntaxhighlight lang="c#"> | |||
using System; | |||
using System.Diagnostics; | |||
using System.IO; | |||
using System.Linq; | |||
using System.Threading.Tasks; | |||
using ClosedXML.Excel; | |||
class Program | |||
{ | |||
// Mainメソッドは変更なし | |||
static async Task Main(string[] args) | |||
{ | |||
// ...略 | |||
} | |||
static async Task ProcessLargeDataAsync() | |||
{ | |||
const int totalRows = 1_000_000; | |||
const int batchSize = 100_000; // 1度に処理する行数 | |||
using (var workbook = new XLWorkbook()) | |||
{ | |||
var worksheet = workbook.Worksheets.Add("大量データ"); | |||
// ヘッダを追加 | |||
worksheet.Cell(1, 1).Value = "ID"; | |||
worksheet.Cell(1, 2).Value = "Value"; | |||
for (int start = 0; start < totalRows; start += batchSize) | |||
{ | |||
int end = Math.Min(start + batchSize, totalRows); | |||
await ProcessBatchAsync(worksheet, start, end); | |||
Console.WriteLine($"Processed rows {start + 1} to {end}"); | |||
} | |||
// 合計を計算 | |||
worksheet.Cell(totalRows + 2, 1).Value = "合計"; | |||
worksheet.Cell(totalRows + 2, 2).FormulaA1 = $"=SUM(B2:B{totalRows + 1})"; | |||
await SaveWorkbookAsync(workbook, "大量データ処理_分割.xlsx"); | |||
} | |||
} | |||
static async Task ProcessBatchAsync(IXLWorksheet worksheet, int start, int end) | |||
{ | |||
await Task.Run(() => | |||
{ | |||
var data = Enumerable.Range(start + 1, end - start) | |||
.Select(i => new { ID = i, Value = i * 2 }); | |||
worksheet.Cell(start + 2, 1).InsertData(data); | |||
}); | |||
} | |||
// SaveWorkbookAsyncメソッドは変更なし | |||
static async Task SaveWorkbookAsync(XLWorkbook workbook, string filePath) | |||
{ | |||
// ...略 | |||
} | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
==== 使用例 : ストリーミング処理 ==== | |||
ストリーミング処理とは、データを連続的に処理する方法であり、全データを1度にメモリに読み込むことなく、データが利用可能になり次第処理を行う。<br> | |||
典型的には、データを小さな塊 (チャンク) として読み取り、即座に処理・結果を出力する。<br> | |||
<br> | |||
<u>ストリーミング処理をExcelファイルの生成に適用するのは難しく、特に、Closed XMLライブラリではサポートされていない。</u><br> | |||
<br> | |||
<u>OpenXML SDKを使用する場合は、より低レベルでのストリーミングに近い処理が可能であるが、実装が複雑になる。</u><br> | |||
<br><br> | <br><br> | ||