我正在尝试使用以下代码逐行散列文件(16 MB):
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()
根据time
命令,这需要10到12秒,这似乎是一个巨大的数字,我考虑使用以下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]
time
在大约2.3秒内运行(仍然按照).
我将在哪里提高我的Elixir代码的性能?我试图将初始流拆分为10个块,并为每个块启动异步任务:
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()
但它产生的结果甚至更差,大约11秒以上,为什么会这样?