Spaces:
Running
on
Zero
Running
on
Zero
import logging | |
import traceback | |
from typing import Dict, Any, Tuple, Optional, Union | |
from PIL import Image | |
import numpy as np | |
class ResultCacheManager: | |
""" | |
專門處理結果快取和性能優化,包括快取策略管理、快取大小控制和快取命中率優化 | |
""" | |
def __init__(self, cache_max_size: int = 100): | |
""" | |
初始化結果快取管理器 | |
Args: | |
cache_max_size: 最大快取項目數 | |
""" | |
self.logger = logging.getLogger(__name__) | |
# 初始化結果快取 | |
self.results_cache = {} # 使用圖像hash作為鍵 | |
self.cache_max_size = cache_max_size # 最大快取項目數 | |
def generate_cache_key(self, image_hash: int, additional_params: Tuple) -> Tuple: | |
""" | |
生成快取鍵 | |
Args: | |
image_hash | |
additional_params: 附加參數元組 | |
Returns: | |
Tuple: 快取鍵 | |
""" | |
try: | |
return (image_hash, additional_params) | |
except Exception as e: | |
self.logger.error(f"Error generating cache key: {e}") | |
self.logger.error(traceback.format_exc()) | |
return (0, additional_params) | |
def get_region_cache_key(self, image_hash: int, box: Tuple[float, ...], | |
detection_type: str) -> Tuple: | |
""" | |
生成區域分析的快取鍵 | |
Args: | |
image_hash | |
box: 邊界框 | |
detection_type: 檢測類型 | |
Returns: | |
Tuple: 區域快取鍵 | |
""" | |
try: | |
return self.generate_cache_key(image_hash, (tuple(box), detection_type)) | |
except Exception as e: | |
self.logger.error(f"Error generating region cache key: {e}") | |
self.logger.error(traceback.format_exc()) | |
return (0, (tuple(box), detection_type)) | |
def get_image_cache_key(self, image_hash: int, analysis_type: str, | |
detailed_analysis: bool = False) -> Tuple: | |
""" | |
生成整張圖像分析的快取鍵 | |
Args: | |
image_hash: 圖像哈希值 | |
analysis_type: 分析類型 | |
detailed_analysis: 是否詳細分析 | |
Returns: | |
Tuple: 圖像快取鍵 | |
""" | |
try: | |
return self.generate_cache_key(image_hash, (analysis_type, detailed_analysis)) | |
except Exception as e: | |
self.logger.error(f"Error generating image cache key: {e}") | |
self.logger.error(traceback.format_exc()) | |
return (0, (analysis_type, detailed_analysis)) | |
def get_cached_result(self, cache_key: Tuple) -> Optional[Dict[str, Any]]: | |
""" | |
獲取快取結果 | |
Args: | |
cache_key: 快取鍵 | |
Returns: | |
Optional[Dict[str, Any]]: 快取結果,如果不存在則返回None | |
""" | |
try: | |
return self.results_cache.get(cache_key) | |
except Exception as e: | |
self.logger.error(f"Error getting cached result: {e}") | |
self.logger.error(traceback.format_exc()) | |
return None | |
def set_cached_result(self, cache_key: Tuple, result: Dict[str, Any]): | |
""" | |
設置快取結果 | |
Args: | |
cache_key: 快取鍵 | |
result: 要快取的結果 | |
""" | |
try: | |
self.results_cache[cache_key] = result | |
self.manage_cache_size() | |
except Exception as e: | |
self.logger.error(f"Error setting cached result: {e}") | |
self.logger.error(traceback.format_exc()) | |
def manage_cache_size(self): | |
""" | |
管理結果快取大小 | |
""" | |
try: | |
if len(self.results_cache) > self.cache_max_size: | |
oldest_key = next(iter(self.results_cache)) | |
del self.results_cache[oldest_key] | |
except Exception as e: | |
self.logger.error(f"Error managing cache size: {e}") | |
self.logger.error(traceback.format_exc()) | |
def clear_cache(self): | |
""" | |
清空快取 | |
""" | |
try: | |
self.results_cache.clear() | |
self.logger.info("Cache cleared successfully") | |
except Exception as e: | |
self.logger.error(f"Error clearing cache: {e}") | |
self.logger.error(traceback.format_exc()) | |
def get_cache_stats(self) -> Dict[str, Any]: | |
""" | |
獲取快取統計信息 | |
Returns: | |
Dict[str, Any]: 快取統計信息 | |
""" | |
try: | |
return { | |
"cache_size": len(self.results_cache), | |
"max_cache_size": self.cache_max_size, | |
"cache_usage_ratio": len(self.results_cache) / self.cache_max_size if self.cache_max_size > 0 else 0 | |
} | |
except Exception as e: | |
self.logger.error(f"Error getting cache stats: {e}") | |
self.logger.error(traceback.format_exc()) | |
return { | |
"cache_size": 0, | |
"max_cache_size": self.cache_max_size, | |
"cache_usage_ratio": 0 | |
} | |
def set_max_cache_size(self, max_size: int): | |
""" | |
設置最大快取大小 | |
Args: | |
max_size: 新的最大快取大小 | |
""" | |
try: | |
self.cache_max_size = max(1, max_size) | |
self.manage_cache_size() | |
self.logger.info(f"Max cache size set to {self.cache_max_size}") | |
except Exception as e: | |
self.logger.error(f"Error setting max cache size: {e}") | |
self.logger.error(traceback.format_exc()) | |
def remove_cached_result(self, cache_key: Tuple) -> bool: | |
""" | |
移除特定的快取結果 | |
Args: | |
cache_key: 快取鍵 | |
Returns: | |
bool: 是否成功移除 | |
""" | |
try: | |
if cache_key in self.results_cache: | |
del self.results_cache[cache_key] | |
return True | |
return False | |
except Exception as e: | |
self.logger.error(f"Error removing cached result: {e}") | |
self.logger.error(traceback.format_exc()) | |
return False | |
def is_cache_enabled(self) -> bool: | |
""" | |
檢查快取是否啟用 | |
Returns: | |
bool: 快取啟用狀態 | |
""" | |
return self.cache_max_size > 0 | |
def get_cache_keys(self) -> list: | |
""" | |
獲取所有快取鍵 | |
Returns: | |
list: 快取鍵列表 | |
""" | |
try: | |
return list(self.results_cache.keys()) | |
except Exception as e: | |
self.logger.error(f"Error getting cache keys: {e}") | |
self.logger.error(traceback.format_exc()) | |
return [] | |
def has_cached_result(self, cache_key: Tuple) -> bool: | |
""" | |
檢查是否存在快取結果 | |
Args: | |
cache_key: 快取鍵 | |
Returns: | |
bool: 是否存在快取結果 | |
""" | |
try: | |
return cache_key in self.results_cache | |
except Exception as e: | |
self.logger.error(f"Error checking cached result: {e}") | |
self.logger.error(traceback.format_exc()) | |
return False | |