""" Skrypt do kompakcji bazy danych LanceDB. Usuwa historię wersjonowania (985+ manifests w _versions/) i tworzy świeżą bazę tylko z aktualnymi danymi, drastycznie zmniejszając liczbę plików do przesłania przez Git LFS. """ import lancedb import shutil from pathlib import Path import sys # Konfiguracja LANCEDB_PATH = "./lancedb" TABLE_NAME = "a11y_expert" BACKUP_PATH = "./lancedb_backup" TEMP_EXPORT_PATH = "./lancedb_temp" def main(): """Główna funkcja kompakcji bazy danych.""" print("🔄 Rozpoczynam kompakcję bazy danych LanceDB...") # Krok 1: Sprawdź czy baza istnieje db_path = Path(LANCEDB_PATH) if not db_path.exists(): print(f"❌ Baza danych nie istnieje: {LANCEDB_PATH}") sys.exit(1) # Krok 2: Utwórz backup (opcjonalnie) backup_path = Path(BACKUP_PATH) if backup_path.exists(): print(f"⚠️ Backup już istnieje: {BACKUP_PATH}") print("Pomijam tworzenie nowego backupu (istniejący backup pozostaje niezmieniony)") else: print(f"📦 Tworzę backup: {LANCEDB_PATH} -> {BACKUP_PATH}") shutil.copytree(LANCEDB_PATH, BACKUP_PATH) print(f"✅ Backup utworzony: {BACKUP_PATH}") # Krok 3: Otwórz bazę i eksportuj dane print(f"📖 Otwieram bazę: {LANCEDB_PATH}") db = lancedb.connect(LANCEDB_PATH) if TABLE_NAME not in db.table_names(): print(f"❌ Tabela '{TABLE_NAME}' nie istnieje w bazie") sys.exit(1) table = db.open_table(TABLE_NAME) total_docs = len(table) print(f"📊 Znaleziono {total_docs} dokumentów w tabeli '{TABLE_NAME}'") # Krok 4: Eksportuj do Arrow print("🔄 Eksportuję dane do formatu Arrow...") arrow_table = table.to_arrow() print(f"✅ Wyeksportowano {len(arrow_table)} rekordów") # Wyświetl informacje o schemacie print(f"📋 Schema tabeli:\n{arrow_table.schema}") # Krok 5: Sprawdź rozmiar przed kompakcją def get_dir_size(path): """Oblicz rozmiar katalogu w MB.""" total = sum(f.stat().st_size for f in Path(path).rglob('*') if f.is_file()) return total / (1024 * 1024) def count_files(path): """Policz wszystkie pliki w katalogu.""" return sum(1 for _ in Path(path).rglob('*') if _.is_file()) old_size_mb = get_dir_size(LANCEDB_PATH) old_files = count_files(LANCEDB_PATH) print(f"📏 Rozmiar przed kompakcją: {old_size_mb:.2f} MB ({old_files} plików)") # Krok 6: Usuń starą bazę print(f"🗑️ Usuwam starą bazę: {LANCEDB_PATH}") shutil.rmtree(LANCEDB_PATH) print(f"✅ Usunięto starą bazę") # Krok 7: Utwórz nową bazę ze świeżymi danymi print(f"🆕 Tworzę nową bazę: {LANCEDB_PATH}") new_db = lancedb.connect(LANCEDB_PATH) # Konwertuj Arrow Table na listę słowników data_dicts = arrow_table.to_pylist() print(f"💾 Zapisuję {len(data_dicts)} dokumentów do nowej bazy...") new_table = new_db.create_table(TABLE_NAME, data=data_dicts, mode="create") print(f"✅ Utworzono nową tabelę '{TABLE_NAME}' z {len(new_table)} dokumentami") # Krok 8: Sprawdź rozmiar po kompakcji new_size_mb = get_dir_size(LANCEDB_PATH) new_files = count_files(LANCEDB_PATH) print(f"📏 Rozmiar po kompakcji: {new_size_mb:.2f} MB ({new_files} plików)") # Podsumowanie saved_mb = old_size_mb - new_size_mb saved_files = old_files - new_files print(f""" ✅ Kompakcja zakończona! 📊 Statystyki: - Dokumenty: {total_docs} - Rozmiar przed: {old_size_mb:.2f} MB ({old_files} plików) - Rozmiar po: {new_size_mb:.2f} MB ({new_files} plików) - Zaoszczędzono: {saved_mb:.2f} MB ({saved_files} plików) - Redukcja: {(saved_mb/old_size_mb*100):.1f}% rozmiaru, {(saved_files/old_files*100):.1f}% plików 📦 Backup dostępny w: {BACKUP_PATH} ⚠️ Następne kroki: 1. Sprawdź czy baza działa: python -c "import lancedb; db = lancedb.connect('./lancedb'); print(len(db.open_table('a11y_expert')))" 2. Usuń stare pliki z Git: git rm -r --cached lancedb/ 3. Dodaj nową bazę: git add lancedb/ 4. Commit: git commit -m "Compact LanceDB - remove version history" 5. Push: git push """) if __name__ == "__main__": main()