私は次のコードでの行で、ファイル(16メガバイト)の行をハッシュしようとしている:大容量ファイルとハッシュ - パフォーマンスの懸念
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コードであることを考慮する膨大な数のようだ:約2.3秒で
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
によります)。
私はエリクシールコードのパフォーマンスを向上させるためにどのようにしたいですか?
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+秒、偶数またはより悪い結果が得られ、その理由は次のとおりです。私は10のチャンクに最初のストリームを分割し、それぞれの非同期タスクを発射することを試みましたか?
1)ハッシュラインを削除すると、最初のパフォーマンスがどのように異なるのですか? 2)そして、あなたが2番目の例で行うことを反映するように、 'hash'の定義を変更するとどうなりますか? 3)あなたのコードはハッシュをまったく使用しないので、ループ本体全体を最適化することは許されます。 Pythonはそれを利用できないかもしれませんが、計算の結果が実際に使用されることを保証することは、まだ良い習慣です。 – CodesInChaos
約3)については、3つのコードとそのそれぞれのランタイムを私の質問で更新しました。そのため、すべてのハッシュを使用して文字を追加し、最後に最初のハッシュされた行を印刷します。約1)、実際には、ハッシングなしで私の最初のコードのための巨大なperf boostがあり、それは約4秒で実行されます。 – Kernael
4)最初は 'crypto.hash'を使用し、2番目は' md5'を直接使用します。それはパフォーマンスの違いに責任がありますか? 5)あなたのラインはどれくらい平均的ですか? – CodesInChaos