File size: 4,290 Bytes
1dab660
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
"""
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()