Erlang/OTP Forums

Author Message

<  Erlang-DACH  ~  Anfängerfrage zur Rekursion

Boesebaerchi
Posted: Wed Jan 05, 2011 10:25 pm Reply with quote
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.
View user's profile Send private message AIM Address
Boesebaerchi
Posted: Fri Jan 07, 2011 11:14 am Reply with quote
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 Smile. 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.
View user's profile Send private message AIM Address
Boesebaerchi
Posted: Fri Jan 07, 2011 10:09 pm Reply with quote
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.
View user's profile Send private message AIM Address

Display posts from previous:  

All times are GMT
Page 1 of 1
This forum is locked: you cannot post, reply to, or edit topics.

Jump to:  

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