2222from modelcache .manager .object_data .base import ObjectBase
2323from modelcache .manager .eviction import EvictionBase
2424from modelcache .manager .eviction_manager import EvictionManager
25+ from modelcache .manager .eviction .memory_cache import MemoryCacheEviction
2526from modelcache .utils .log import modelcache_log
2627
2728NORMALIZE = True
@@ -38,9 +39,7 @@ def save_query_resp(self, query_resp_dict, **kwargs):
3839 pass
3940
4041 @abstractmethod
41- def import_data (
42- self , questions : List [Any ], answers : List [Any ], embedding_datas : List [Any ], model :Any
43- ):
42+ def import_data (self , questions : List [Any ], answers : List [Any ], embedding_datas : List [Any ], model :Any ):
4443 pass
4544
4645 @abstractmethod
@@ -162,10 +161,18 @@ def __init__(
162161 self .v = v
163162 self .o = o
164163
164+ # added
165+ self .eviction_base = MemoryCacheEviction (
166+ policy = policy ,
167+ maxsize = max_size ,
168+ clean_size = clean_size ,
169+ on_evict = self ._evict_ids )
170+
165171 def save (self , questions : List [any ], answers : List [any ], embedding_datas : List [any ], ** kwargs ):
166172 model = kwargs .pop ("model" , None )
167173 self .import_data (questions , answers , embedding_datas , model )
168174
175+
169176 def save_query_resp (self , query_resp_dict , ** kwargs ):
170177 save_query_start_time = time .time ()
171178 self .s .insert_query_resp (query_resp_dict , ** kwargs )
@@ -217,14 +224,20 @@ def import_data(
217224 cache_datas .append ([ans , question , embedding_data , model ])
218225
219226 ids = self .s .batch_insert (cache_datas )
220- datas_ = [VectorData ( id = ids [ i ], data = embedding_data . astype ( "float32" )) for i , embedding_data in enumerate ( embedding_datas ) ]
221- self . v . mul_add (
222- datas_ ,
223- model
224-
225- )
227+ datas = []
228+ for i , embedding_data in enumerate ( embedding_datas ):
229+ _id = ids [ i ]
230+ datas . append ( VectorData ( id = _id , data = embedding_data . astype ( "float32" )))
231+ self . eviction_base . put ([( _id , cache_datas [ i ])], model = model )
232+ self . v . mul_add ( datas , model )
226233
227234 def get_scalar_data (self , res_data , ** kwargs ) -> Optional [CacheData ]:
235+ model = kwargs .pop ("model" )
236+ #Get Data from RAM Cache
237+ _id = res_data [1 ]
238+ cache_hit = self .eviction_base .get (_id , model = model )
239+ if cache_hit is not None :
240+ return cache_hit
228241 cache_data = self .s .get_data_by_id (res_data [1 ])
229242 if cache_data is None :
230243 return None
@@ -244,8 +257,10 @@ def search(self, embedding_data, **kwargs):
244257 return self .v .search (data = embedding_data , top_k = top_k , model = model )
245258
246259 def delete (self , id_list , ** kwargs ):
247- model = kwargs .pop ("model" , None )
260+ model = kwargs .pop ("model" )
248261 try :
262+ for id in id_list :
263+ self .eviction_base .get_cache (model ).pop (id , None ) # Remove from in-memory LRU too
249264 v_delete_count = self .v .delete (ids = id_list , model = model )
250265 except Exception as e :
251266 return {'status' : 'failed' , 'milvus' : 'delete milvus data failed, please check! e: {}' .format (e ),
@@ -262,23 +277,51 @@ def delete(self, id_list, **kwargs):
262277 def create_index (self , model , ** kwargs ):
263278 return self .v .create (model )
264279
265- def truncate (self , model_name ):
280+ def truncate (self , model ):
281+ # drop memory cache data
282+ self .eviction_base .clear (model )
283+
266284 # drop vector base data
267285 try :
268- vector_resp = self .v .rebuild_col (model_name )
286+ vector_resp = self .v .rebuild_col (model )
269287 except Exception as e :
270288 return {'status' : 'failed' , 'VectorDB' : 'truncate VectorDB data failed, please check! e: {}' .format (e ),
271289 'ScalarDB' : 'unexecuted' }
272290 if vector_resp :
273291 return {'status' : 'failed' , 'VectorDB' : vector_resp , 'ScalarDB' : 'unexecuted' }
274292 # drop scalar base data
275293 try :
276- delete_count = self .s .model_deleted (model_name )
294+ delete_count = self .s .model_deleted (model )
277295 except Exception as e :
278296 return {'status' : 'failed' , 'VectorDB' : 'rebuild' ,
279297 'ScalarDB' : 'truncate scalar data failed, please check! e: {}' .format (e )}
280298 return {'status' : 'success' , 'VectorDB' : 'rebuild' , 'ScalarDB' : 'delete_count: ' + str (delete_count )}
281299
300+ # added
301+ def _evict_ids (self , ids , ** kwargs ):
302+ model = kwargs .get ("model" )
303+ if not ids or any (i is None for i in ids ):
304+ modelcache_log .warning ("Skipping eviction for invalid IDs: %s" , ids )
305+ return
306+
307+ if isinstance (ids ,str ):
308+ ids = [ids ]
309+
310+ for _id in ids :
311+ self .eviction_base .get_cache (model ).pop (_id , None )
312+
313+ try :
314+ self .s .mark_deleted (ids )
315+ modelcache_log .info ("Evicted from scalar storage: %s" , ids )
316+ except Exception as e :
317+ modelcache_log .error ("Failed to delete from scalar storage: %s" , str (e ))
318+
319+ try :
320+ self .v .delete (ids , model = model )
321+ modelcache_log .info ("Evicted from vector storage (model=%s): %s" , model , ids )
322+ except Exception as e :
323+ modelcache_log .error ("Failed to delete from vector storage (model=%s): %s" , model , str (e ))
324+
282325 def flush (self ):
283326 self .s .flush ()
284327 self .v .flush ()
0 commit comments