@@ -42,10 +42,11 @@ def __init__(
4242 max_result_size_mb: Max size of individual result to cache in MB (default: 10)
4343 max_total_cache_mb: Max total cache size in MB (default: 200)
4444 """
45- self .ttl_seconds = ttl_seconds or int (os .getenv ("QUERY_CACHE_TTL" , "60" ))
46- self .max_size = max_size or int (os .getenv ("QUERY_CACHE_MAX_SIZE" , "100" ))
47- self .max_result_size_mb = max_result_size_mb or int (os .getenv ("QUERY_CACHE_MAX_RESULT_MB" , "10" ))
48- self .max_total_cache_mb = max_total_cache_mb or int (os .getenv ("QUERY_CACHE_MAX_TOTAL_MB" , "200" ))
45+ # CRITICAL: Reduced defaults for memory-constrained deployments
46+ self .ttl_seconds = ttl_seconds or int (os .getenv ("QUERY_CACHE_TTL" , "30" )) # Was 60s, now 30s
47+ self .max_size = max_size or int (os .getenv ("QUERY_CACHE_MAX_SIZE" , "50" )) # Was 100, now 50
48+ self .max_result_size_mb = max_result_size_mb or int (os .getenv ("QUERY_CACHE_MAX_RESULT_MB" , "5" )) # Was 10MB, now 5MB
49+ self .max_total_cache_mb = max_total_cache_mb or int (os .getenv ("QUERY_CACHE_MAX_TOTAL_MB" , "100" )) # Was 200MB, now 100MB
4950
5051 # Use OrderedDict for LRU eviction
5152 self .cache : OrderedDict [str , Tuple [Dict [str , Any ], datetime ]] = OrderedDict ()
@@ -87,13 +88,13 @@ def _start_cleanup_thread(self):
8788 def _cleanup_expired (self ):
8889 """
8990 Background task to remove expired cache entries.
90- Runs every ttl_seconds/2 to ensure memory is actually released .
91+ Runs every 10 seconds for aggressive memory cleanup .
9192 """
9293 import time
9394 import gc
9495
95- # Run cleanup at half the TTL interval (more aggressive)
96- cleanup_interval = max ( self . ttl_seconds // 2 , 10 )
96+ # CRITICAL: Run cleanup every 10 seconds for aggressive memory management
97+ cleanup_interval = 10
9798
9899 while self ._cleanup_running :
99100 try :
@@ -115,6 +116,9 @@ def _cleanup_expired(self):
115116
116117 # Remove expired entries
117118 for key in expired_keys :
119+ # CRITICAL: Delete data reference first
120+ cached_data , _ = self .cache [key ]
121+ del cached_data
118122 del self .cache [key ]
119123 expired_count += 1
120124 self .expirations += 1
@@ -125,10 +129,23 @@ def _cleanup_expired(self):
125129 if expired_count > 0 :
126130 logger .info (
127131 f"Cache cleanup: removed { expired_count } expired entries, "
128- f"freed { freed_mb :.1f} MB"
132+ f"freed { freed_mb :.1f} MB, cache size now { self . current_cache_size_mb :.1f } MB "
129133 )
130- # Force GC to actually release the memory
131- gc .collect ()
134+ # Force aggressive GC to actually release the memory
135+ collected = gc .collect ()
136+
137+ # CRITICAL: Force Python to return memory to OS
138+ try :
139+ import ctypes
140+ import platform
141+ if platform .system () == 'Linux' :
142+ libc = ctypes .CDLL ('libc.so.6' )
143+ libc .malloc_trim (0 )
144+ logger .info (f"Cache cleanup GC: collected { collected } objects, returned memory to OS" )
145+ else :
146+ logger .info (f"Cache cleanup GC: collected { collected } objects" )
147+ except Exception :
148+ logger .info (f"Cache cleanup GC: collected { collected } objects" )
132149
133150 except Exception as e :
134151 logger .error (f"Error in cache cleanup thread: { e } " , exc_info = True )
@@ -277,6 +294,8 @@ def set(self, sql: str, limit: int, result: Dict[str, Any]) -> bool:
277294 # Remove oldest entry
278295 oldest_key , (oldest_data , _ ) = self .cache .popitem (last = False )
279296 oldest_size = self ._estimate_size_mb (oldest_data )
297+ # CRITICAL: Delete data reference to free memory
298+ del oldest_data
280299 self .current_cache_size_mb -= oldest_size
281300 self .evictions += 1
282301 logger .debug (
@@ -289,6 +308,8 @@ def set(self, sql: str, limit: int, result: Dict[str, Any]) -> bool:
289308 # Remove oldest (first item in OrderedDict)
290309 oldest_key , (oldest_data , _ ) = self .cache .popitem (last = False )
291310 oldest_size = self ._estimate_size_mb (oldest_data )
311+ # CRITICAL: Delete data reference to free memory
312+ del oldest_data
292313 self .current_cache_size_mb -= oldest_size
293314 self .evictions += 1
294315 logger .debug (f"Cache EVICT: Entry count limit ({ self .max_size } )" )
0 commit comments