67 lines
2.6 KiB
Python
67 lines
2.6 KiB
Python
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.") |