This commit is contained in:
2026-01-13 16:42:40 +01:00
parent 2aee823e87
commit 01aa1249b9
2 changed files with 267 additions and 0 deletions

View File

@@ -0,0 +1,67 @@
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.")