←Select platform

SlidingExpiration Property

Summary

The window of time during which a cache entry must be touched else it is deleted from the cache.

Syntax
C#
C++/CLI
Python
public TimeSpan SlidingExpiration { get; set; } 
public:  
   property TimeSpan^ SlidingExpiration 
   { 
      TimeSpan^ get() 
      void set(TimeSpan^ value) 
   } 
SlidingExpiration # get and set (DocumentMemoryCacheStartOptions) 

Property Value

The window of time during which a cache entry must be touched else it is deleted from the cache. The default value is 60 seconds.

Remarks

Cache entries are touched when the corresponding document is loaded from the cache. Each load operation will add another SlidingExpiration amount of time to the document.

Refer to DocumentMemoryCache for more information.

Example
C#
Java
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, 
      }); 
   } 
} 
 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.net.MalformedURLException; 
import java.net.URI; 
import java.net.URISyntaxException; 
import java.net.URL; 
import java.nio.file.Files; 
import java.nio.file.Paths; 
import java.util.ArrayList; 
import java.util.Calendar; 
import java.util.List; 
import java.util.concurrent.Callable; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.Future; 
import java.util.regex.Pattern; 
 
import org.junit.*; 
import org.junit.runner.JUnitCore; 
import org.junit.runner.Result; 
import org.junit.runner.notification.Failure; 
import static org.junit.Assert.*; 
 
import leadtools.*; 
import leadtools.annotations.engine.*; 
import leadtools.barcode.*; 
import leadtools.caching.*; 
import leadtools.codecs.*; 
import leadtools.document.*; 
import leadtools.document.DocumentMimeTypes.UserGetDocumentStatusHandler; 
import leadtools.document.converter.*; 
import leadtools.document.writer.*; 
import leadtools.ocr.*; 
 
 
public void documentMemoryCacheExample() { 
   // The cache we are using 
   FileCache cache = new FileCache(); 
   cache.setPolicySerializationMode(CacheSerializationMode.JSON); 
   cache.setDataSerializationMode(CacheSerializationMode.JSON); 
   cache.setCacheDirectory("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:\\LEADTOOLS23\\Resources\\Images\\leadtools.pdf", 
         // Large Excel files are complex and loading may take some time, they could use 
         // memory cache 
         "C:\\LEADTOOLS23\\Resources\\Images\\large_sheet_5k.xlsx", 
   }; 
 
   // First process without memory cache and obtain some times 
   loadAndProcessDocument(documentFiles, cache); 
 
   // Then process with memory cache 
 
   // Document memory cache options to use 
   DocumentMemoryCacheStartOptions documentMemoryCacheStartOptions = new DocumentMemoryCacheStartOptions(); 
   // Use for documents that take more than 2 seconds to load initially 
 
   documentMemoryCacheStartOptions.setMinimumLoadDuration(2); 
   // No maximum limit on the number of cache items to keep in memory 
   documentMemoryCacheStartOptions.setMaximumItems(0); 
   // Purse items from the cache if not touched for 60 seconds 
   documentMemoryCacheStartOptions.setSlidingExpiration(60); 
   // Check for expired items every 60 seconds 
   documentMemoryCacheStartOptions.setTimerInterval(60); 
 
   // Use it 
   DocumentFactory.getDocumentMemoryCache().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.getDocumentMemoryCache().stop(); 
} 
 
private static void loadAndProcessDocument(String[] documentFiles, 
      ObjectCache cache) { 
   System.out.println("Using memory cache is " + 
         DocumentFactory.getDocumentMemoryCache().isStarted()); 
   String[] documentIds = new String[documentFiles.length]; 
 
   long stopwatch = System.currentTimeMillis(); 
   long elapsed; 
 
   for (int i = 0; i < documentFiles.length; i++) { 
      String documentFile = documentFiles[i]; 
      int pageCount; 
 
      // First try without memory cache and obtain some times 
      stopwatch = System.currentTimeMillis(); 
      LoadDocumentOptions loadOptions = new LoadDocumentOptions(); 
      loadOptions.setCache(cache); 
      LEADDocument document = DocumentFactory.loadFromFile(documentFile, 
            loadOptions); 
      document.getImages().setMaximumImagePixelSize(2048); 
      document.setAutoSaveToCache(false); 
      document.setAutoDeleteFromCache(false); 
      document.saveToCache(); 
      documentIds[i] = document.getDocumentId(); 
      pageCount = document.getPages().size(); 
 
      elapsed = (System.currentTimeMillis() - stopwatch) / 1000; 
      System.out.println("Initial load from " + documentFile + " took ~" + elapsed + " seconds"); 
      // Check if it's in the cache 
      System.out.println("Is using memory cache is " 
            + DocumentFactory.getDocumentMemoryCache().hasDocument(documentIds[i], 
                  false)); 
 
      // Next call LoadFromCache and process a page in multiple threads 
      stopwatch = System.currentTimeMillis(); 
      loadAllPagesInThreads(documentIds[i], pageCount, cache); 
      elapsed = (System.currentTimeMillis() - stopwatch) / 1000; 
      System.out.println("Multi-threaded load of all pages took ~" + elapsed 
            + " seconds"); 
   } 
   // Clean up 
   deleteDocumentsFromCache(documentIds, cache); 
} 
 
private static void loadAllPagesInThreads(String documentId, int pageCount, ObjectCache cache) { 
   int maxDegreeOfParallelism = 4; 
   ExecutorService executorService = Executors.newFixedThreadPool(maxDegreeOfParallelism); 
   try { 
      // Create a list to hold the Future objects representing the processing of each 
      // page 
      List<Future<Void>> futures = new ArrayList<>(); 
      for (int pageNumber = 1; pageNumber <= pageCount; pageNumber++) { 
         final int currentPage = pageNumber; 
         // Submit each page processing task to the executor 
         Future<Void> future = executorService.submit(new Callable<Void>() { 
            @Override 
            public Void call() throws Exception { 
               // Load the document from the cache 
               LoadFromCacheOptions options = new LoadFromCacheOptions(); 
               options.setCache(cache); 
               options.setDocumentId(documentId); 
               LEADDocument document = DocumentFactory.loadFromCache(options); 
               DocumentPage documentPage = document.getPages().get(currentPage - 1); 
               RasterImage image = documentPage.getImage(); 
               return null; 
            } 
         }); 
         futures.add(future); 
      } 
      // Wait for all tasks to complete 
      for (Future<Void> future : futures) { 
         future.get(); 
      } 
   } catch (Exception e) { 
      e.printStackTrace(); 
   } finally { 
      // Shut down the executor service 
      executorService.shutdown(); 
   } 
} 
 
private static void deleteDocumentsFromCache(String[] documentIds, 
      ObjectCache cache) { 
   for (String documentId : documentIds) { 
      LoadFromCacheOptions loadOptions = new LoadFromCacheOptions(); 
      loadOptions.setCache(cache); 
      loadOptions.setDocumentId(documentId); 
      DocumentFactory.deleteFromCache(loadOptions); 
   } 
} 
Requirements

Target Platforms

Help Version 23.0.2024.2.29
Products | Support | Contact Us | Intellectual Property Notices
© 1991-2024 LEAD Technologies, Inc. All Rights Reserved.

Leadtools.Document Assembly
Products | Support | Contact Us | Intellectual Property Notices
© 1991-2023 LEAD Technologies, Inc. All Rights Reserved.