import pandas as pd from sqlalchemy import create_engine import time # --- KONFIGURACE --- db_user = 'root' db_pass = 'Vlado9674+' db_host = '192.168.1.76' db_port = '3307' db_name = 'torrents' # <--- ZDE DOPLNIT NÁZEV DATABÁZE # --- PŘIPOJENÍ --- connection_string = f'mysql+mysqlconnector://{db_user}:{db_pass}@{db_host}:{db_port}/{db_name}' engine = create_engine(connection_string) # SQL dotaz - vybíráme i full_path, abychom mohli v Pandas ukázat příklad cesty # POZOR: Načítání 5.8M textových řetězců (full_path) zabere dost RAM (odhadem 2-4 GB). query = """ SELECT id, blake3, file_size, full_path FROM file_md5_index FORCE INDEX (idx_full_path_prefix) WHERE host_name='Tower1' AND full_path LIKE '/mnt/user/#Library%' """ print("1. Začínám stahovat data z MySQL do RAM...") start_load = time.time() try: # Stáhnutí dat df = pd.read_sql(query, engine) end_load = time.time() print(f"-> Data stažena za: {end_load - start_load:.2f} sekund") print(f"-> Počet řádků v paměti: {len(df)}") print("\n2. Začínám hledat duplicity (Pandas GroupBy)...") start_process = time.time() # Logika hledání duplicit # Najdeme jen ty, co mají duplicitní hash duplicity = df[df.duplicated(subset=['blake3'], keep=False)] if not duplicity.empty: # Seskupení vysledek = duplicity.groupby('blake3').agg({ 'file_size': 'first', # Velikost souboru (předpokládáme stejnou pro stejný hash) 'id': 'count', # Počet výskytů 'full_path': lambda x: x.iloc[0] # Ukázka první cesty (rychlejší než 'first') }).rename(columns={'id': 'pocet_kopii'}) # Filtrujeme jen ty, co mají skutečně více kopií a seřadíme podle velikosti * počet kopií # (Chceme vidět, kde plýtváme nejvíc místa) vysledek['celkove_plytvani'] = vysledek['file_size'] * (vysledek['pocet_kopii'] - 1) vysledek = vysledek.sort_values('celkove_plytvani', ascending=False) end_process = time.time() print(f"-> Zpracováno za: {end_process - start_process:.4f} sekund") print("\n--- TOP 20 NEJVĚTŠÍCH DUPLICIT ---") # Zobrazíme hash, počet kopií, velikost jednoho souboru a ukázku cesty print(vysledek[['pocet_kopii', 'file_size', 'full_path']].head(20)) print(f"\nCelkem nalezeno {len(vysledek)} unikátních souborů, které mají duplicity.") else: print("Nebyly nalezeny žádné duplicity.") except Exception as e: print(f"\nCHYBA: {e}") print("Zkontrolujte prosím název databáze a jestli máte dost paměti RAM.")