DocumentMemoryCache Class (original) (raw)

Summary

Document memory cache support.

Syntax

public class DocumentMemoryCache 

public: ref class DocumentMemoryCache

class DocumentMemoryCache: 

Example

This example will simulate a client loading a small and then a large document from URI and then shows the times used. This sample will produce results similar to the following:

Using memory cache is False Initial load from leadtools.pdf took 0 seconds Is using memory cache is False Multi-threaded load of all pages took ~0 seconds Initial load from complex.xlsx took ~10 seconds Is using memory cache is False 1 Multi-threaded load of all pages took **13** 1 seconds Using memory cache is True Initial load from leadtools.pdf took 0 seconds Is using memory cache is False Multi-threaded load of all pages took ~0 seconds Initial load from complex.xlsx took ~10 seconds Is using memory cache is True 2 Multi-threaded load of all pages took **0** 2 seconds

Notice how the time it took to load all the pages of complex.xlsx in a multi-threaded code decreased from 13 to almost 0 seconds when memory cache is used.

using Leadtools; using Leadtools.Codecs; using Leadtools.Document.Writer; using Leadtools.Document; using Leadtools.Caching; using Leadtools.Annotations.Engine; using Leadtools.Ocr; using Leadtools.Barcode; using Leadtools.Document.Converter; public void DocumentMemoryCacheExample() { // The cache we are using FileCache cache = new FileCache(); cache.PolicySerializationMode = CacheSerializationMode.Json; cache.DataSerializationMode = CacheSerializationMode.Json; cache.CacheDirectory = @"c:\cache-dir"; // The document files we are using string[] documentFiles = { // PDF files are very fast to load and will not use memory cache @"C:\LEADTOOLS22\Resources\Images\leadtools.pdf", // Large Excel files are complex and loading may take some time, they could use memory cache @"C:\LEADTOOLS22\Resources\Images\complex.xlsx", }; // First process without memory cache and obtain some times LoadAndProcessDocument(documentFiles, cache); // Then process with memory cache // Document memory cache options to use var documentMemoryCacheStartOptions = new DocumentMemoryCacheStartOptions { // Use for documents that take more than 2 seconds to load initially MinimumLoadDuration = TimeSpan.FromSeconds(2), // No maximum limit on the number of cache items to keep in memory MaximumItems = 0, // Purse items from the cache if not touched for 60 seconds SlidingExpiration = TimeSpan.FromSeconds(60), // Check for expired items every 60 seconds TimerInterval = TimeSpan.FromSeconds(60) }; // Use it DocumentFactory.DocumentMemoryCache.Start(documentMemoryCacheStartOptions); // Run again // For the first document, times should be very close to the since this is a PDF document and is very fast (less than MinimumLoadDuration) // For the second document, initial times should be the same, but loading all pages should be much faster LoadAndProcessDocument(documentFiles, cache); // Clean up DocumentFactory.DocumentMemoryCache.Stop(); } private static void LoadAndProcessDocument(string[] documentFiles, ObjectCache cache) { Console.WriteLine($"Using memory cache is {DocumentFactory.DocumentMemoryCache.IsStarted}"); string[] documentIds = new string[documentFiles.Length]; var stopwatch = new Stopwatch(); TimeSpan elapsed; for (var i = 0; i < documentFiles.Length; i++) { string documentFile = documentFiles[i]; int pageCount; // First try without memory cache and obtain some times stopwatch.Restart(); using (LEADDocument document = DocumentFactory.LoadFromFile( documentFile, new LoadDocumentOptions { Cache = cache })) { document.Images.MaximumImagePixelSize = 2048; document.AutoSaveToCache = false; document.AutoDeleteFromCache = false; document.SaveToCache(); documentIds[i] = document.DocumentId; pageCount = document.Pages.Count; } elapsed = stopwatch.Elapsed; Console.WriteLine($"Initial load from {Path.GetFileName(documentFile)} took ~{(int)elapsed.TotalSeconds} seconds"); // Check if it's in the cache Console.WriteLine($"Is using memory cache is {DocumentFactory.DocumentMemoryCache.HasDocument(documentIds[i], false)}"); // Next call LoadFromCache and process a page in multiple threads stopwatch.Restart(); LoadAllPagesInThreads(documentIds[i], pageCount, cache); elapsed = stopwatch.Elapsed; Console.WriteLine($"Multi-threaded load of all pages took ~{(int)elapsed.TotalSeconds} seconds"); } // Clean up DeleteDocumentsFromCache(documentIds, cache); } private static void LoadAllPagesInThreads(string documentId, int pageCount, ObjectCache cache) { System.Threading.Tasks.Parallel.For( 1, pageCount + 1, new System.Threading.Tasks.ParallelOptions { MaxDegreeOfParallelism = 4 }, (int pageNumber) => { // Load the document from the cache using (LEADDocument document = DocumentFactory.LoadFromCache( new LoadFromCacheOptions { Cache = cache, DocumentId = documentId })) { // Simulates processing of the page DocumentPage documentPage = document.Pages[pageNumber - 1]; using (RasterImage image = documentPage.GetImage()) { } } }); } private static void DeleteDocumentsFromCache(string[] documentIds, ObjectCache cache) { foreach (string documentId in documentIds) { DocumentFactory.DeleteFromCache(new LoadFromCacheOptions { Cache = cache, DocumentId = documentId, }); } }