some optimizations about config loading

This commit is contained in:
Infstellar
2025-02-27 21:03:12 +08:00
parent 953740d4f5
commit efba8c18bd
4 changed files with 49 additions and 17 deletions
+37 -13
View File
@@ -8,6 +8,19 @@ import typing as t
from config.utils import *
"""
修改配置:用with打开Config,修改后自动保存。可以修改多个配置。
with Config() as config:
config.api.embedding_models.base_url = '123'
使用配置:每次使用前实例化Config
!!!注意:如果不重新实例化,config的值不会改变!!!
应当将Config视为一次性的实例。如果要缓存这个实例,应当保证这个缓存在使用的生命周期内,config不会被改变。
对于改不了的屎山代码,请在实例化Config时,将keep_tracked参数设置为True。注意:设置后,这个缓存将是只读的。
每次重新实例化不会重新读盘。在内存中有一个缓存。
"""
CONFIG_DIR = os.path.dirname(os.path.abspath(__file__))
CONFIG_FILE = os.path.join(CONFIG_DIR, 'config.yaml')
CONFIG_EXAMPLE_FILE = os.path.join(CONFIG_DIR, 'config.example.yaml')
@@ -71,17 +84,17 @@ class BaseConfig(BaseModel, frozen=False, extra='allow'):
# 'value': value
# })
class ObserverdDict(dict):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.__dict__['settled_dicts'] = []
def __setitem__(self, key, value):
print(f"setitem:{key}-{value}")
if not isinstance(value, BaseConfig):
self.__dict__['settled_dicts'].append({
'key': [key],
'value': value
})
# class ObserverdDict(dict):
# def __init__(self, *args, **kwargs):
# super().__init__(*args, **kwargs)
# self.__dict__['settled_dicts'] = []
# def __setitem__(self, key, value):
# print(f"setitem:{key}-{value}")
# if not isinstance(value, BaseConfig):
# self.__dict__['settled_dicts'].append({
# 'key': [key],
# 'value': value
# })
class EmbeddingModelConfig(BaseConfig):
name: str
@@ -179,7 +192,7 @@ class Config(BaseConfig):
def __init__(self):
def __init__(self, keep_tracked = False):
if sys.gettrace() is not None:
frame = inspect.currentframe().f_back
filename = frame.f_code.co_filename
@@ -191,9 +204,13 @@ class Config(BaseConfig):
print('loading config')
data = load_yaml_file(CONFIG_FILE)
config_cache.set_config(data)
if keep_tracked:
self.__dict__['keep_tracked'] = True
super().__init__(**data)
def __enter__(self):
if self.__dict__['keep_tracked']:
raise RuntimeError('Config object is being tracked, which cannot be modified.')
return self
def __exit__(self, exc_type, exc_val, exc_tb):
@@ -213,7 +230,6 @@ class Config(BaseConfig):
# print('Config object is being deleted')
@property
def base_dir(self) -> str:
"""获取项目根目录"""
@@ -250,6 +266,12 @@ class Config(BaseConfig):
"""获取缓存文件的绝对路径"""
return os.path.join(self.base_dir,self.paths.label_images_cache_file)
def __getattr__(self, item):
if self.__dict__['keep_tracked']:
return Config().__getattr__(item)
else:
return super().__getattr__(item)
# def reload(self) -> None:
# """重新加载配置文件"""
# new_config = Config()
@@ -267,5 +289,7 @@ if __name__ == '__main__':
with Config() as config:
config.api.embedding_models.base_url = '123'
"""使用配置:每次使用前实例化Config"""
"""注意:如果不重新实例化,config的值不会改变!应当将Config视为一次新的实例。如果要缓存这个实例,应当保证config缓存在使用的生命周期内不会改变。"""
print(Config().api.embedding_models.base_url)
+4 -4
View File
@@ -67,8 +67,8 @@ if st.session_state.result_folder_name == '' and 'image_folder_name' in st.sessi
st.session_state.result_folder_name = st.session_state.image_folder_name
if 'pre_generate_result' not in st.session_state:
st.session_state.pre_generate_result = {}
if 'resource_pack_service' not in st.session_state:
st.session_state.resource_pack_service = ResourcePackService()
# if 'resource_pack_service' not in st.session_state:
# st.session_state.resource_pack_service = ResourcePackService()
# api
if 'api_key' not in st.session_state:
@@ -211,7 +211,7 @@ with st.sidebar:
cover_path = st.session_state.cropped_cover_path if pack_cover else None
# 创建资源包
pack_dir = st.session_state.resource_pack_service.create_resource_pack(
pack_dir = ResourcePackService().create_resource_pack(
name=pack_name,
version=pack_version,
author=pack_author,
@@ -224,7 +224,7 @@ with st.sidebar:
# 生成zip文件
try:
zip_path = st.session_state.resource_pack_service.export_resource_pack(pack_dir)
zip_path = ResourcePackService().export_resource_pack(pack_dir)
# 提供zip文件下载
with open(zip_path, "rb") as f:
+1
View File
@@ -18,6 +18,7 @@ import threading
class EmbeddingService:
def __init__(self):
self.config = Config(keep_tracked=True)
self.api_key = Config().api.embedding_models.api_key
self.base_url = Config().api.embedding_models.base_url
self.local_models = {}
+7
View File
@@ -22,7 +22,11 @@ class ImageSearch:
self.image_data = None
self._try_load_cache()
def __reload_class_cache(self):
self.embedding_service = EmbeddingService()
def _try_load_cache(self) -> None:
self.__reload_class_cache()
"""尝试加载缓存"""
# 获取所有启用的资源包的缓存文件
cache_files = self.resource_pack_manager.get_cache_files()
@@ -133,6 +137,7 @@ class ImageSearch:
return self.image_data is not None
def generate_cache(self, progress_bar) -> None:
self.__reload_class_cache()
"""生成缓存"""
if self.embedding_service.mode == 'local':
# 确保模型已加载
@@ -170,6 +175,7 @@ class ImageSearch:
raise RuntimeError(error_message)
def _generate_pack_cache(self, pack_id: str, pack_info: Dict, progress_bar) -> None:
self.__reload_class_cache()
"""为指定的资源包生成缓存"""
img_dir = pack_info["path"]
if not os.path.isabs(img_dir):
@@ -359,6 +365,7 @@ class ImageSearch:
return np.dot(a, b)
def search(self, query: str, top_k: int = 5, api_key: Optional[str] = None) -> List[str]:
self.__reload_class_cache()
"""语义搜索最匹配的图片"""
if not self.has_cache():
return []