IRONSOFTWAREHOME

Hautes Utilisations de Mémoire lors de l'OCR en Bloc

Curtis Chau
Curtis Chau
Updated: 29 juin 2026

Exécuter l'OCR sur plusieurs segments PDF à la fois multiplie l'utilisation de la mémoire. Chaque tâche rend des bitmaps pleine-page via un OcrInput, et un moteur IronTesseract frais par segment recharge les fichiers modèle de langue à chaque fois. À pleine concurrence de processeur, cela pousse le pic de mémoire dans la gamme des multi-GB, avec des pointes qui échouent dans des environnements à mémoire limitée.

L'OCR est naturellement gourmand en mémoire. Tout OcrInput rend des bitmaps pleine-page, et tout moteur IronTesseract charge les fichiers modèle de langue en mémoire. Créer un nouveau moteur par segment recharge ces modèles de manière répétée, et exécuter une tâche OCR par cœur de CPU (Environment.ProcessorCount) permet à de nombreux travaux lourds en bitmap de s'exécuter côte à côte. Rien ne limitant le nombre de tâches actives, le pic de mémoire évolue directement avec la concurrence.

La solution consiste à limiter le nombre de tâches en cours : restreindre la concurrence, réutiliser les moteurs à partir d'un pool, et réguler le travail avec un sémaphore.

Solution

1. Limiter la concurrence OCR

Limitez le nombre de tâches OCR simultanées à un petit plafond. Moins de tâches simultanées signifient moins de bitmaps pleine-page en mémoire à la fois, ce qui réduit directement le pic. Ajustez le plafond à la capacité de la machine.

// Clamp concurrency to avoid memory saturation and CPU over-subscription.
int concurrency = Math.Clamp(Environment.ProcessorCount / 2, 1, 4);
C#

2. Regrouper les moteurs

Créez exactement un moteur IronTesseract par créneau concurrent lors du démarrage et réutilisez-les à travers chaque segment, plutôt que de construire un nouveau moteur et de recharger le modèle de langue à chaque fois.

// Pre-create one engine per concurrent slot and reuse them across segments.
var enginePool = new ConcurrentBag<IronTesseract>(
    Enumerable.Range(0, concurrency).Select(_ => new IronTesseract())
);
C#

Construire le pool une seule fois amortit le coût de chargement du modèle de langue sur l'ensemble de l'exécution au lieu de le payer par segment.

3. Réguler le travail avec un sémaphore

Initialisez un SemaphoreSlim à la limite de concurrence et enveloppez-le dans using. Chaque tâche appelle WaitAsync() avant de commencer et Release() dans un finally, ainsi seul le nombre autorisé de segments est en vol à la fois.

using var semaphore = new SemaphoreSlim(concurrency);
await semaphore.WaitAsync();
try
{
    // Rent a pre-loaded engine from the pool.
    if (!enginePool.TryTake(out var ocr))
        ocr = new IronTesseract(); // Defensive fallback; should never be reached.
    try
    {
        using var input = new OcrInput();
        input.LoadPdf(segmentStream); // page-range segment produced upstream
        var ocrResult = await ocr.ReadAsync(input);
        ocrResult.SaveAsSearchablePdf(outputPath);
    }
    finally
    {
        enginePool.Add(ocr); // Return engine to pool for the next waiting segment.
    }
}
finally
{
    semaphore.Release();
}
C#

L'appel WaitAsync() bloque jusqu'à ce qu'un créneau se libère, et retourner le moteur dans le finally intérieur transmet un moteur préchargé directement au segment suivant en attente.

4. Dispose OcrInput per segment

Enveloppez chaque OcrInput dans un using afin que ses bitmaps page rendus soient libérés dès que le segment est lu, avant que la tâche suivante ne revendique le créneau.

Conseils: Le using sur OcrInput est ce qui empêche la mémoire bitmap de s'accumuler à travers les segments; sans cela, les créneaux libérés conservent encore leurs bitmaps de page.
Curtis Chau
Rédacteur technique

Curtis Chau détient un baccalauréat en informatique (Université de Carleton) et se spécialise dans le développement front-end avec expertise en Node.js, TypeScript, JavaScript et React. Passionné par la création d'interfaces utilisateur intuitives et esthétiquement plaisantes, Curtis aime travailler avec des frameworks modernes et créer des manuels bien structurés et visuellement attrayants.

...
Lire la suite

Prêt à commencer?

Nuget Downloads 6,236,385Version :2026.9vient de sortir

Obtenez votre clé d'essai 30 jours gratuitement.
Aucune carte de crédit ou création de compte requise
Bibliothèque C# NuGet pour PDF
Installer avec NuGet

Version : 2026.9

PM > Install-Package IronOcr
nuget.org/packages/IronOcr/
  1. Dans l'explorateur de solutions, faites un clic droit sur Références, Gestion des packages NuGet
  2. Sélectionnez Parcourir et cherchez "IronOCR"
  3. Sélectionnez le package et installez
C# PDF DLL
Télécharger DLL

Version : 2026.9

ou téléchargez le programme d'installation Windows ici.

  1. Téléchargez et décompressez IronOCR à un emplacement tel que ~/Libs dans votre répertoire du projet
  2. Dans l'Explorateur de Solutions de Visual Studio, faites un clic droit sur Références. Sélectionnez Parcourir, "IronOCR.dll"

Licences à partir de $999

Vous avez une question ? Contactez notre équipe de développement.

Key in blue circle

Obtenez votre clé d'essai de 30 jours instantanément.

Your trial license will be sent to your email address

Aucune restriction. 100 % débloqué. Pas de carte bancaire.

bullet_checkedAucune carte de crédit ou création de compte requiseAucune restriction. 100 % débloqué. Pas de carte bancaire.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Obtenez Votre Consultation sans Engagement
Remplissez le formulaire ci-dessous ou envoyez un email à sales@ironsoftware.com
Vos informations seront toujours gardées confidentielles.
De confiance par des millions d'ingénieurs dans le monde entier
Logos des clients d'Iron Software
Obtenez votre clé d'essai 30 jours gratuitement.
Aucune carte de crédit ou création de compte requise