|
|
| Author |
Message |
< Erlang-DACH ~ Anfängerfrage zur Rekursion |
| Boesebaerchi |
Posted: Wed Jan 05, 2011 10:25 pm |
|
|
|
Joined: 05 Jan 2011
Posts: 3
|
Hallo!
Ich habe kürzlich angefangen Erlang zu lernen und versuche mich gerade daran den ED2K Hash einer ca. 250MB Datei zu berechnen. Mein Problem dabei ist das mir der Speicher vollläuft. Ich habe eine gobe Vermutung warum das so ist, komme aber trotzdem nicht auf eine Lösung für mein Problem.
Der ED2K Hash berechnet sich aus den MD4 Hashes von jeweils 9728000 Byte Blöcken der Datei die ich per file:read_file() eingelesen habe. Ich muss also die Datei:
1. in 9728000 Byte Blöcke aufbrechen
2. jeweils den MD4 Hash berechnen
3. die MD4 Hashes als String hintereinanderhängen
4. den String noch einmal MD4 Hashen.
Ich habe versucht die Datei als Binary mit Tail-Recursion durchzureichen, aber ich glaube genau da liegt mein Problem. Bei dem 10. oder 11. Aufruf der Funktion bricht mir die VM mit einem malloc Fehler ab. Ich vermute das für jeden Aufruf eine Kopie der Datei im Speicher angelegt wird, was natürlich dann schnell dafür sorgt das mein Speicher vollläuft.
So habe ich versucht das Problem zu lösen, Schritt 4 habe ich ersteinmal weggelassen:
Code: ed2k(Binary) -> ed2k(Binary,0, byte_size(Binary),"").
ed2k(Binary,Start,Size,Acc) when Start < Size -> ed2k(Binary,Start+9728000,Size,Acc++bin_to_hexstr(crypto:md4(binary:part(Binary,Start,Start+9728000))));
ed2k(_Binary,_Start,_Size,Acc) -> Acc.
Kann mir jemand sagen wie ich ohne die Kopien der Datei auskomme? Ich könnte den ED2K Hash natürlich in einer externen C Funktion berechnen, aber das ist natürlich nicht Sinn der Übung.
Vielen Dank,
Dirk. |
|
|
| Back to top |
|
| Boesebaerchi |
Posted: Fri Jan 07, 2011 11:14 am |
|
|
|
Joined: 05 Jan 2011
Posts: 3
|
Hallo,
Ich nehme an ich habe meine Frage zu kompliziert gestellt. Ich habe den Code-teil der nicht Funktioniert als Minimalbeispiel isoliert und angehängt.
Es passiert folgendes:
Code:
w1620:ADB dirk$ erl
Erlang R14B (erts-5.8.1) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.8.1 (abort with ^G)
1> c(ed2khash,[debug_info]),im(),ii(ed2khash),ed2khash:hash().
beam.smp(1045,0xb0250000) malloc: *** mmap(size=2560622592) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
beam.smp(1045,0xb0250000) malloc: *** mmap(size=2560622592) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
beam.smp(1045,0xb0250000) malloc: *** mmap(size=2560581632) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
beam.smp(1045,0xb0250000) malloc: *** mmap(size=2560581632) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Illegal instruction
ich komme leider nicht darauf warum es nicht funktioniert und ich hoffe mir kann jemand von euch helfen . Da in der Ausgabe was von malloc steht (und eine Größe von ca 2.5GB angefordert wird) nehme ich nach wie vor an das mein Binary mehrfach kopiert wird. Liege ich damit richtig?
Viele Grüße,
Dirk. |
|
|
| Back to top |
|
| Boesebaerchi |
Posted: Fri Jan 07, 2011 10:09 pm |
|
|
|
Joined: 05 Jan 2011
Posts: 3
|
Inzwischen bin ich selbst draufgekommen... Wer lesen kann ist klar im Vorteil:
Was ich geschrieben habe währ richtig wenn binary:part mit Start und Ende arbeiten würde. Es erfordert aber Start und Länge, das habe ich durcheinandergebracht.
Blöder Fehler um 2 Tage zu brauchen bis ich ihn sehe :/
Gruß,
Dirk. |
|
|
| Back to top |
|
|
|
All times are GMT
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You cannot attach files in this forum You cannot download files in this forum
|
|
|