próbuję hash plik (16 MB), linia po linii z następującego kodu:duży plik i mieszania - wydajność troska
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()
Zgodnie z poleceniem time
, to trwa od 10 do 12 sekund, który wydaje się być ogromna liczba się, uznając, że mnie z następującego kodu Pythona:
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]
(nadal działa zgodnie z time
) w około 2,3 sekundy.
Gdzie powinienem ustawić, aby poprawić działanie mojego kodu Elixir? Starałem się, aby podzielić początkowego strumienia na 10 kawałków, a ogień asynchroniczne zadanie dla każdego z nich:
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()
ale daje jeszcze gorsze wyniki, lub około 11+ sekund do uruchomienia, to dlaczego?
1) W jaki sposób wydajność pierwszego różni się po usunięciu linii mieszania? 2) A co, jeśli zmienisz definicję 'hash', tak aby odzwierciedlała to, co robisz w drugim przykładzie? 3) Twój kod w ogóle nie używa skrótu, więc byłoby możliwe zoptymalizowanie całego obiektu pętli. Chociaż python może nie być w stanie tego wykorzystać, nadal dobrą praktyką jest zapewnienie, że wynik obliczeń zostanie faktycznie wykorzystany. – CodesInChaos
Około 3), zaktualizowałem trzy kody i ich odpowiednie środowisko uruchomieniowe w moim pytaniu, aby wszyscy użyli skrótów, dodając do nich znak i drukowac pierwszą haszowaną linię na końcu. Około 1), istnieje rzeczywiście ogromny dopalacz dla mojego pierwszego kodu bez skrótu, działa w około 4s. – Kernael
4) Pierwszy używa 'crypto.hash' drugi używa bezpośrednio' md5'. Czy to jest odpowiedzialne za różnicę wydajności? 5) Jak długie są twoje linie na averabe? – CodesInChaos