IRONSOFTWAREHOME

大規模PDFでのReadPdf時のメモリピーク

Curtis Chau
Curtis Chau
Updated: 2026年6月29日

大きなPDF全体に対してBarcodeReader.ReadPdf()を一度呼び出すことで、要求されたすべてのページが設定されたDPIでスキャン用にレンダリングされます。そのため、ピークメモリは一定ではなく、ページ数と解像度によってスケールします。 248ページ、80MBのファイルを300DPIで処理する際、メモリは3GBから8GBの間で推移し、12GBまでのスパイクがあったため、メモリ制限のある環境ではエラーが発生することに十分な大きさだった。

BarcodeReader.ReadPdf()は渡されたすべてのページを単一の操作で処理します。 一度に大規模で高DPIのドキュメントの全ページ範囲を読み込むと、それらのページがすべてメモリに保持されるため、ページセットの大きさと共にピーク使用量が増加します。 これは読み込みがバッチ化されていることを示しており、IronBarcodeの確認された欠陥ではありません。

解決策

1. 固定ページチャンクで読み込む

文書をchunkSizeはピークメモリを低くしますが、パスを増やすため、環境のメモリ制限に合わせて調整します。

var barcodeMetadata = new List<BarcodeResult>();
var pageChunks = Enumerable.Range(1, pdf.PageCount)
    .GroupBy(i => i / 50)
    .Select(g => g.ToArray())
    .ToList();
foreach (var chunk in pageChunks)
{
    var readerOptions = new PdfBarcodeReaderOptions
    {
        ExpectMultipleBarcodes = true,
        ExpectBarcodeTypes = IronBarCode.BarcodeEncoding.AllOneDimensional,
        Speed = ReadingSpeed.Detailed,
        ScanMode = BarcodeScanMode.OnlyDetectionModel,
        DPI = 300,
        PageNumbers = chunk
    };
    Console.WriteLine($"Processing pages: Pages {chunk.First()}-{chunk.Last()}");
    var chunkResult = BarcodeReader.ReadPdf(pdf.Stream, readerOptions);
    if (chunkResult != null && chunkResult.Count > 0)
    {
        barcodeMetadata.AddRange(chunkResult);
    }
    // Optional memory pressure relief
    GC.Collect();
    GC.WaitForPendingFinalizers();
}
Console.WriteLine($"Total barcodes found: {barcodeMetadata.Count}");
C#

各イテレーションはPageNumbersで名前付けされたページのみを読み取るので、メモリはファイル全体にわたって蓄積される代わりに、チャンク間で減少します。

2. PDFストリームをキャッシュしてその位置をリセットする

ループの前にストリームをローカルに読み取り、それをチャンクごとに巻き戻します。pdfStream.Seek(0, SeekOrigin.Begin)を呼び出します。

3. リーダーオプションを一度だけ構築する

ループ外でPageNumbersのみを変更することで、各イテレーションごとに新しいオプションオブジェクトを割り当てるのを避けます。

4. 結果リストの事前サイズ設定

結果が追加されると内部の配列が繰り返し倍増するのを避けるため、推定容量で結果リストを初期化します。 再現は、開始の目安としておおよそ10ページごとに1つのバーコードを推定します。

Curtis Chau
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

...
詳しく読む

準備はできましたか?

Nuget Downloads 2,422,100バージョン:2026.9リリースされたばかり

あなたの無料30日間の試用キーをすぐに入手。
クレジットカードやアカウントの作成は不要です。
PDF用C# NuGetライブラリ
NuGetでインストール

バージョン: 2026.9

PM > Install-Package BarCode
nuget.org/packages/BarCode/
  1. ソリューションエクスプローラーで参照を右クリックし、NuGetパッケージを管理を選択
  2. 「参照」を選択して「IronBarCode」を検索
  3. パッケージを選択してインストール
C# PDF DLL
DLLをダウンロード

バージョン: 2026.9

  1. IronBarcodeをダウンロードして、ソリューションディレクトリ内の~/Libsなどの場所に解凍してください
  2. Visual Studioのソリューションエクスプローラーで、Referencesを右クリックします。 "IronBarcode.dll"を選択します

ライセンス料金は$999から

Key in blue circle

無料の30日間トライアルキーをすぐに入手してください。

Your trial license will be sent to your email address

制限なし。100% ロック解除済み。クレジットカード不要。

bullet_checkedクレジットカードやアカウントの作成は不要です。制限なし。100% ロック解除済み。クレジットカード不要。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
無料のライブデモを予約する
Booking Badge

世界中の数百万人のエンジニアから信頼されています。

ライセンスはより安く
義務のない相談を受ける
下記のフォームを記入するか、sales@ironsoftware.comにメールしてください。
あなたの詳細は常に守秘されます。
世界中の数百万人のエンジニアから信頼されています。
ライセンスはより安く
あなたの無料30日間の試用キーをすぐに入手。
クレジットカードやアカウントの作成は不要です。