z230
This commit is contained in:
67
Pandas/10 DuplicateTest.py
Normal file
67
Pandas/10 DuplicateTest.py
Normal 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.")
|
||||
Reference in New Issue
Block a user