Salve a tutti, era un po' che non frequentavo il forum, a causa di numerosi impegni...
Vi spiego la mia situazione, magari qualcuno può chiarirmi bene e mettere una pezza alla mia ignoranza

.
Ho dovuto recuperare da un hdd rotto, delle foto, quindi ho recuperato i settori non danneggiati e trasferiti in un file.img
Tramite Scalpel (utilizzo linux mint), ho estratto più di 350GB di immagini, tra cui molte immagini che non servivano perché troppo piccole.
Rendendomi conto della quantità immonda di lavoro, ho pensato bene che non potevo controllare a mano 350GB di immagini

...
Ho creato così uno script, molto velocemente, scritto anche abbastanza male, ma che funziona e rispetta le mie esigenze:
In sostanza, ho 304 cartelle, con molti file jpg per ogni cartella.
Il programma cerca per ogni cartella, le immagini jpg "grandi" e funzionanti.
Vi allego il primo codice:
import os, time, shutil, tarfile #fnmatch
from PIL import Image
import shutil
all_files=[]
sext = []
temp = ""
print(time.strftime("%H|%M|%S"))
#chiedo all'utente che estensioni vuole cercare, in questo caso a me interessano i jpg, quindi inserisco: .jpg
#dopo aver scelto le estensioni, scrivo 0 e invio
while True:
sext.append(input("cerca: "))
if sext[-1] == "0":
del sext[-1]
break
sext = tuple(sext)
#naviga fra le cartelle di Files recuperati, e cerca tutti i file che finiscono con "sext", è una tupla di estensioni, in questo caso, mi interessa solo ".jpg"
for parent, directories, filenames in os.walk("/media/mionomeutente/PENNA USB/Files recuperati"):
for x in filenames:
if x.endswith(sext):
fileDaAnalizzare = parent+'/'+x
#apre il file con estensione specificata, e verifica che l'immagine abbia una certa grandezza
try:
im = Image.open(fileDaAnalizzare)
width, height = im.size
if(width > 350 and height >350):
document_path = os.path.join(parent,x)
print(document_path)
#copio semplicemente l'immagine che rispetta le mie esigenze nella cartella grandi
shutil.copy(document_path, '/media/mionomeutente/PENNA USB/grandi')
except:
pass
print(time.strftime("%H|%M|%S"))
Ecco, potevo anche fermarmi qui, il programma è molto basico, funziona e rispetta le mie esigenze, ma poi mi sono chiesto:
Se fossero invece più thread a fare questa operazione, e non uno, il tempo si ridurrebbe in modo significativo?
(ricordiamoci che sono 350GB che deve confrontare...)
Così, sempre velocemente (ed ovviamente scritto male), ho scritto lo stesso programma, modificato per funzionare a thread,
Posto il codice:
import re, os, threading, sys, shutil, random
from PIL import Image
nThreadz = 0
threadz = []
while (nThreadz <= 0):
nThreadz = int(input("numero di thread: "))
all_files=[]
sext = []
temp = ""
while True:
sext.append(input("cerca: "))
if sext[-1] == "0":
del sext[-1]
break
sext = tuple(sext)
listMatch = []
for parent, directories, filenames in os.walk("/media/mionomeutente/PENNA USB/Files recuperati"):
listMatch.append(parent)
print("attualmente, %d siti" %len(listMatch))
class scan(threading.Thread):
def __init__(self, group=None, target=None, name=None, args=(), kwargs=None, daemon=None):
threading.Thread.__init__(self, group=group, target=target, name=name, daemon=daemon)
self.args = args
self.kwargs = kwargs
return
def run(self):
#print(self.args)
global nThreadz, sext
#non è detto che il numero di thread sia divisibile con i listMatch
if (self.args != (nThreadz-1)):
vadoDa = self.args*(len(listMatch)//nThreadz)
vadoA = (self.args+1)*(len(listMatch)//nThreadz)
#print("vado da "+str(vadoDa)+" a "+str(vadoA))
else:
vadoDa = self.args*(len(listMatch)//nThreadz)
vadoA = len(listMatch)-1
#print("vado da "+str(vadoDa)+" a "+str(vadoA))
#ogni thread cerca in una cartella (304 il totale delle cartelle), e si divide il lavoro
for percorso in listMatch[vadoDa:vadoA]:
for parent, directories, filenames in os.walk(percorso):
for x in filenames:
if x.endswith(sext):
fileDaAnalizzare = parent+'/'+x
#print(parent+'/'+x)
#apre il file con estensione specificata, e cerca quel pezzo di codice o frase
try:
im = Image.open(fileDaAnalizzare)
width, height = im.size
if(width > 350 and height >350):
document_path = os.path.join(parent,x)
#print('trovata: '+document_path)
if(not(os.path.exists('/media/mionomeutente/PENNA USB/grandi/'+x))):
shutil.copy(document_path, '/media/mionomeutente/PENNA USB/grandi')
else:
nomeRandom = random.randint(0,1000000000)
nomeRandom = str(nomeRandom)+x
shutil.copy(document_path, '/media/mionomeutente/PENNA USB/grandi/'+nomeRandom)
except:
pass
#sys.exit(0)
for x in range(0,nThreadz):
threadz.append(scan(args=(x)))
for x in range(0,nThreadz):
threadz[x].start()
Il funzionamento è identico allo script precedente, con la differenza che posso scegliere la quantità di thread per "dividermi" il lavoro.. pensavo.
In realtà ho ottenuto dei risultati molto strani:
all'aumentare dei numeri di thred, i file setacciati non aumentavano in maniera significativa, ma.... diminuivano

1 thread = 3181 elementi in 30 secondi
2 thread = 648 elementi in 30 secondi
3 thread = 764 elementi in 30 secondi
304 thread = 166 elementi in 30 secondi
Spero che qualcuno possa trovare interessante il mio topic, e che questo "mistero" mi sia chiarito

(non escludo chiaramente la possibilità che io abbia commesso qualche errore)