IRONSOFTWAREHOME

Pico Alto de Memória Durante Leitura de PDFs em PDF Grandes

Curtis Chau
Curtis Chau
Updated: 29 de junho de 2026

Chamar BarcodeReader.ReadPdf() uma vez para um PDF grande renderiza cada página solicitada para escaneamento no DPI configurado, assim a memória de pico escala com a contagem de páginas e resolução em vez de se manter plana. Em um arquivo de 248 páginas, 80MB a 300 DPI, a memória variava entre 3GB e 8GB com picos de até 12GB, o suficiente para falhar em ambientes com limitação de memória.

BarcodeReader.ReadPdf() processa cada página entregue a ele em uma única operação. Quando o intervalo completa de páginas de um documento grande e de alta resolução é lido de uma vez, todas essas páginas são mantidas na memória juntas, então o uso de pico cresce com o tamanho do conjunto de páginas. Isso reflete como a leitura é empacotada, não um defeito confirmado no IronBarcode.

Solução

1. Leia em pedaços de página fixos

Divida o documento em pedaços de página fixos com PdfBarcodeReaderOptions.PageNumbers para que apenas um pedaço esteja na memória por vez. Um chunkSize menor reduz a memória de pico, mas adiciona mais passagens, então ajuste-o ao limite de memória do ambiente.

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#

Cada iteração lê apenas as páginas nomeadas em PageNumbers, então a memória cai entre os pedaços em vez de se acumular no arquivo inteiro.

2. Armazene em cache o fluxo de PDF e redefina sua posição

Leia o fluxo em um local uma vez antes do loop, em seguida, rebobine-o por pedaço. A propriedade Stream pode alocar em cada acesso, então armazene-a em var pdfStream = pdf.Stream; e chame pdfStream.Seek(0, SeekOrigin.Begin) antes de cada leitura de pedaço.

3. Construa as opções do leitor uma vez

Construa PdfBarcodeReaderOptions fora do loop e mude apenas PageNumbers por pedaço, em vez de alocar um novo objeto de opções a cada iteração.

4. Pré-dimensione a lista de resultados

Inicialize a lista de resultados com uma capacidade estimada para evitar a duplicação repetida do array interno à medida que os resultados são adicionados. A reprodução estima aproximadamente um código de barras para cada dez páginas como ponto de partida.

Curtis Chau
Redator Técnico

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais bem estruturados e visualmente atraentes.

...
Leia mais

Pronto para começar?

Nuget Downloads 2,452,240Versão:2026.9recém-lançado

Obtenha sua chave de avaliação gratuita de 30 dias instantaneamente.
Não é necessário cartão de crédito nem criação de conta.
Key in blue circle

Obtenha sua chave de avaliação gratuita de 30 dias instantaneamente.

Your trial license will be sent to your email address

Sem limitações. 100% desbloqueado. Sem cartão de crédito.

OR
bullet_checkedNão é necessário cartão de crédito nem criação de conta.Sem limitações. 100% desbloqueado. Sem cartão de crédito.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried Iron Suite
Agende sua demonstração ao vivo gratuita.
Booking Badge

Aprovado por milhões de engenheiros em todo o mundo.

Logotipos dos clientes da Iron Software
Agende sua consulta sem compromisso.
Preencha o formulário abaixo ou envie um e-mail para sales@ironsoftware.com
Os seus dados serão sempre mantidos em sigilo.
Aprovado por milhões de engenheiros em todo o mundo.
Logotipos dos clientes da Iron Software
Obtenha sua chave de avaliação gratuita de 30 dias instantaneamente.
Não é necessário cartão de crédito nem criação de conta.