| | import json |
| | import os |
| | from concurrent.futures import ThreadPoolExecutor |
| | from multiprocessing import cpu_count |
| |
|
| | import args_manager |
| | from modules.util import sha256, HASH_SHA256_LENGTH, get_file_from_folder_list |
| |
|
| | hash_cache_filename = 'hash_cache.txt' |
| | hash_cache = {} |
| |
|
| |
|
| | def sha256_from_cache(filepath): |
| | global hash_cache |
| | if filepath not in hash_cache: |
| | print(f"[Cache] Calculating sha256 for {filepath}") |
| | hash_value = sha256(filepath) |
| | print(f"[Cache] sha256 for {filepath}: {hash_value}") |
| | hash_cache[filepath] = hash_value |
| | save_cache_to_file(filepath, hash_value) |
| |
|
| | return hash_cache[filepath] |
| |
|
| |
|
| | def load_cache_from_file(): |
| | global hash_cache |
| |
|
| | try: |
| | if os.path.exists(hash_cache_filename): |
| | with open(hash_cache_filename, 'rt', encoding='utf-8') as fp: |
| | for line in fp: |
| | entry = json.loads(line) |
| | for filepath, hash_value in entry.items(): |
| | if not os.path.exists(filepath) or not isinstance(hash_value, str) and len(hash_value) != HASH_SHA256_LENGTH: |
| | print(f'[Cache] Skipping invalid cache entry: {filepath}') |
| | continue |
| | hash_cache[filepath] = hash_value |
| | except Exception as e: |
| | print(f'[Cache] Loading failed: {e}') |
| |
|
| |
|
| | def save_cache_to_file(filename=None, hash_value=None): |
| | global hash_cache |
| |
|
| | if filename is not None and hash_value is not None: |
| | items = [(filename, hash_value)] |
| | mode = 'at' |
| | else: |
| | items = sorted(hash_cache.items()) |
| | mode = 'wt' |
| |
|
| | try: |
| | with open(hash_cache_filename, mode, encoding='utf-8') as fp: |
| | for filepath, hash_value in items: |
| | json.dump({filepath: hash_value}, fp) |
| | fp.write('\n') |
| | except Exception as e: |
| | print(f'[Cache] Saving failed: {e}') |
| |
|
| |
|
| | def init_cache(model_filenames, paths_checkpoints, lora_filenames, paths_loras): |
| | load_cache_from_file() |
| |
|
| | if args_manager.args.rebuild_hash_cache: |
| | max_workers = args_manager.args.rebuild_hash_cache if args_manager.args.rebuild_hash_cache > 0 else cpu_count() |
| | rebuild_cache(lora_filenames, model_filenames, paths_checkpoints, paths_loras, max_workers) |
| |
|
| | |
| | save_cache_to_file() |
| |
|
| |
|
| | def rebuild_cache(lora_filenames, model_filenames, paths_checkpoints, paths_loras, max_workers=cpu_count()): |
| | def thread(filename, paths): |
| | filepath = get_file_from_folder_list(filename, paths) |
| | sha256_from_cache(filepath) |
| |
|
| | print('[Cache] Rebuilding hash cache') |
| | with ThreadPoolExecutor(max_workers=max_workers) as executor: |
| | for model_filename in model_filenames: |
| | executor.submit(thread, model_filename, paths_checkpoints) |
| | for lora_filename in lora_filenames: |
| | executor.submit(thread, lora_filename, paths_loras) |
| | print('[Cache] Done') |
| |
|