Sto cercando di hash di un file riga (16 MB) per riga con il seguente codice prestazioni:File di grandi dimensioni e hashing - preoccupazione
def hash(data, protocol) do
:crypto.hash(protocol, data)
|> Base.encode16()
end
File.stream!(path)
|> Stream.map(&hash(&1, :md5) <> "h")
|> Enum.to_list()
|> hd()
|> IO.puts()
Secondo time
comando, questo richiede tra i 10 ei 12 secondi, che sembra essere un numero enorme per, me visto che con il seguente codice Python:
import md5
with open('a', 'r') as f:
content = f.readlines()
l = []
for _, val in enumerate(content):
m = md5.new()
m.update(val)
l.append(m.hexdigest() + "h")
print l[0]
piste (sempre secondo time
) in circa 2,3 secondi.
Dove dovrei stardare per migliorare le prestazioni del mio codice Elixir? Ho cercato di dividere il flusso iniziale in 10 pezzi, e fuoco un'attività asincrona per ciascuno di essi:
File.stream!(path)
|> Stream.chunk(chunk_size) # with chunk_size being (nb_of_lines_in_file/10)
|> Enum.map(fn chunk -> Task.async(fn -> Enum.map(chunk, &hash(&1, :md5) <> "h") end) end)
|> Enum.flat_map(&Task.await/1)
|> hd()
|> IO.puts()
ma i rendimenti pari o peggiori risultati, circa 11+ secondi per eseguire, perché?
1) Come differiscono le prestazioni del primo se si rimuove la linea di hashing? 2) E se modificassi la tua definizione di 'hash' in modo che rispecchi ciò che fai nel secondo esempio? 3) Il tuo codice non usa affatto l'hash, quindi sarebbe lecito ottimizzare l'intero corpo del loop. Mentre python potrebbe non essere in grado di trarne vantaggio, è comunque buona pratica assicurarsi che il risultato dei calcoli venga effettivamente utilizzato. – CodesInChaos
Informazioni su 3), ho aggiornato i tre codici e il rispettivo runtime nella mia domanda in modo che tutti facciano uso degli hash aggiungendo un carattere a loro e stampando la prima riga con hash alla fine. A proposito di 1), c'è davvero un enorme boost di perf per il mio primo codice senza hashing, funziona in circa 4 secondi. – Kernael
4) Il primo usa 'crypto.hash' il secondo usa direttamente' md5'. Questo è responsabile della differenza di prestazioni? 5) Quanto durano le tue battute su averabe? – CodesInChaos