Spaces:
Runtime error
Runtime error
| """Result caching system for GPU quota savings.""" | |
| import hashlib | |
| import time | |
| from pathlib import Path | |
| from typing import Optional, Tuple | |
| import shutil | |
| from core.config import CACHE_EXPIRY_HOURS | |
| class CacheManager: | |
| """Manages result caching to save GPU quota.""" | |
| def __init__(self, cache_dir: str = "cache"): | |
| self.cache_dir = Path(cache_dir) | |
| self.cache_dir.mkdir(exist_ok=True) | |
| self.expiry_seconds = CACHE_EXPIRY_HOURS * 3600 | |
| def get_cache_key(self, prompt: str, quality: str, user_id: str = "default") -> str: | |
| """Generate unique cache key from parameters.""" | |
| # Include hour timestamp for cache invalidation | |
| timestamp = int(time.time() / 3600) | |
| key_string = f"{user_id}_{prompt}_{quality}_{timestamp}" | |
| return hashlib.sha256(key_string.encode()).hexdigest() | |
| def get_cached_result(self, prompt: str, quality: str) -> Optional[Path]: | |
| """Check if result exists in cache.""" | |
| cache_key = self.get_cache_key(prompt, quality) | |
| cache_path = self.cache_dir / f"{cache_key}.glb" | |
| if cache_path.exists(): | |
| file_age = time.time() - cache_path.stat().st_mtime | |
| if file_age < self.expiry_seconds: | |
| print(f"[Cache] Hit: {cache_path.name}") | |
| return cache_path | |
| else: | |
| # Expired, remove it | |
| cache_path.unlink() | |
| print(f"[Cache] Expired: {cache_path.name}") | |
| print(f"[Cache] Miss: {cache_key}") | |
| return None | |
| def save_to_cache(self, prompt: str, quality: str, result_path: Path) -> None: | |
| """Save generation result to cache.""" | |
| cache_key = self.get_cache_key(prompt, quality) | |
| cache_path = self.cache_dir / f"{cache_key}.glb" | |
| shutil.copy(result_path, cache_path) | |
| print(f"[Cache] Saved: {cache_path.name}") | |
| def cleanup_old_cache(self) -> Tuple[int, float]: | |
| """Remove expired cache files.""" | |
| removed_count = 0 | |
| removed_size_mb = 0.0 | |
| for cache_file in self.cache_dir.glob("*.glb"): | |
| file_age = time.time() - cache_file.stat().st_mtime | |
| if file_age > self.expiry_seconds: | |
| size_mb = cache_file.stat().st_size / 1e6 | |
| cache_file.unlink() | |
| removed_count += 1 | |
| removed_size_mb += size_mb | |
| if removed_count > 0: | |
| print(f"[Cache] Cleaned up {removed_count} files ({removed_size_mb:.2f} MB)") | |
| return removed_count, removed_size_mb | |