Results 1 to 14 of 14

Thread: Ervaringen met Delphi XE2?

  1. #1

    Ervaringen met Delphi XE2?

    Tijdens het testen van mijn programma kreeg ik steeds een Out of memory exception. Na wat uitzoekwerk kwam ik er achter dat een array bij mij 3GB aan ram geheugen nodig had, en dat mag een 32bit applicatie niet hebben.

    Dus om het e.e.a. te testen heb ik Delphi XE2 (SP1) gebruikt om mijn programma om te zetten naar 64bit, maar ik begin twijfels te krijgen over de compiler hiervan.

    De editor geeft met blauwe stipjes aan wat gecompileerd wordt, maar bij cruciale delen van mijn programma zie ik de stipjes niet verschijnen terwijl bepaalde regels code toch noodzakelijk zijn.
    Bij het uitvoeren van het programma geven sommige regels niet het gewenste resultaat, en bijvoorbeeld SetLength(Arraynaam, 0) geeft gewoon een RangeCheckError.


    Hebben jullie enig idee waar de oorzaak van die problemen liggen? Het oorspronkelijke 32bit programma werkte namelijk (bijna) probleemloos.

  2. #2
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Arrays van 3GB (extreem grote allocaties) zijn overigens ook geen goed idee in 64-bit. De integer die een array index vormt blijft nl 31-bit (positieve gedeelte van "integer"), met allerlei mogelijke "signed" problemen

    Stipjes die verdwijnen zijn redelijk normaal als je optimizatie aan heb staan. Zet die eens uit, en stackframes aan, en doe dan een build.

  3. #3
    Ik heb de Optimize uitgezet en stackframe aan, maar dat maakt geen verschil. De stipjes komen er niet bij te staan.

    Ondertussen heb ik wat verder geëxperimenteerd, en zie dat de for-loop (het stukje wat niet gecompileerd wordt) met variabele van het type "NativeInt" niet gecompileerd wordt, maar met een "Integer" wel. Andere for-loops hebben dat probleem niet, dus dat is wel vreemd.
    Maar ik zal die variabelen wel terugveranderen naar Integers.

    Wat adviseer jij mij dan om 3GB aan geheugen te alloceren?
    Mijn array bestaat uit records van een aantal Int64-type variabelen.
    Het aantal records in een array zelf blijft onder de grootte van een Integer.

  4. #4
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    1. Heb je ook een build gedaan?
    2. Waarom doe je for loops met nativeint? Itereer je ergens meer dan 4 miljard keer over?
    3. de array is niet de enige datastructuur. Studeer data structuren, of breek op in meerdere arrays.

  5. #5
    1. Ja, .dcu-files en output-file weggegooid en hij heeft alles opnieuw staan te compileren wat significant langer duurde dan dat hij maar 1 document compileert.

    2. Om de applicatie 64-bit te maken werd geadviseerd om de Integer-types om te zetten naar NativeInt. Ik heb dus een gewone replace gedaan van alle Integer-types. Misschien heeft mijn applicatie daardoor misschien 80 bytes meer geheugen gebruikt dan nodig, maar dat vind ik niet erg.

    3. Voor mij leek een array van records de beste datastructuur om data in te verwerken. Maar ik zal onderzoeken of ik de array's niet kan splitsen om zo geheugenruimte vrij te houden.

    Deze punten lossen helaas nog niet op dat ik in Delphi XE2 met de functie SetLength(Arraynaam, 0) gewoon een RangeCheckError krijg.

  6. #6
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Quote Originally Posted by Mister_X View Post
    2. Om de applicatie 64-bit te maken werd geadviseerd om de Integer-types om te zetten naar NativeInt. Ik heb dus een gewone replace gedaan van alle Integer-types. Misschien heeft mijn applicatie daardoor misschien 80 bytes meer geheugen gebruikt dan nodig, maar dat vind ik niet erg.
    Nativeint wordt alleen aangeraden wanneer het betreffende type moet schalen met integer. Niet altijd

    3. Voor mij leek een array van records de beste datastructuur om data in te verwerken.
    Voor kleine data is dat zeker zo. Maar bij 3GB in een enkele array moet je je langzamerhand achter de oren gaan krabben.

    Deze punten lossen helaas nog niet op dat ik in Delphi XE2 met de functie SetLength(Arraynaam, 0) gewoon een RangeCheckError krijg.
    Het zou me niet verbazen als dat met je nativeint geintjes te maken heeft. Een array index blijft vziw integer, en niet nativeint.

  7. #7
    Na veelvuldig testen en proberen ben ik er ook achter gekomen dat de grootte van de array niet zoveel uit maakt. Kleine arrays met 50MB aan data gaan op den duur ook fout. Met deze resultaten in het achterhoofd heb ik MS Visual Studio 2010 geïnstalleerd en de gehele applicatie handmatig omgezet naar C#-code.
    De werking van de code is vrijwel identiek en hoewel dit nu wel een 64-bit programma is heb ik nergens 64-bit integers gebruikt.

    Om mijn programma te testen heb ik een oneindige while-loop ingebouwd waardoor mijn programma een aantal dagen achter elkaar continu heeft gedraaid. Terwijl hij draaide heb ik nergens allocatieproblemen of out-of-range-errors gehad.
    Mijn conclusie is dan ook dat het memory-management van Delphi (de ontwikkelstudio dus) helaas toch ergens een paar steekjes laat vallen waardoor een programma niet voor 100% betrouwbaar en correct werkt.

    Helaas heeft het mij veel tijd gekost om dit probleem uit te zoeken, maar de ervaringen die ik heb opgedaan met debuggen en C# maakt dat al meer dan goed.

  8. #8
    het zou ook zomaar een probleem kunnen zijn waarbij je zelf iets aanmaakt en nooit meer opruimt. Heb je al eens gedraaid met de debugopties van fastmm?

    C# / .NET heeft GC dus het zou zomaar kunnen dat die het eigenlijke probleem voor jou oplost.

  9. #9
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Wat Benno zegt. Als je het niet heel precies kan aantonen zou ik voorzichtig zijn met je conclusies. Zulke problemen zijn niet bekend, en er zijn mensen die met behoorlijke data stromen werken in Delphi.

  10. #10
    Ik heb geen FastMM gebruikt. De array die ik gebruikte is een lijst van records met vaste variablelengtes zoals integers en bytes. (Geen strings of arrays in een record.)
    Volgens mij zou het totaal niet uit moeten maken dat ik totaal geen FastMM gebruik, want bij SetLength(Arraynaam, 0) hoort gewoon geen foutmelding te komen.

    Bij de laatste testen van mijn programma was er ruim 2GB aan ongebruikt RAM beschikbaar en zou ik zeker geen geheugenproblemen mogen krijgen. 50MB aan extra geheugen zou dus geen probleem mogen zijn.


    Ik vind het ook heel vreemd dat ik als enigste die problemen ondervindt, en hoop ook graag de oorzaak van dit probleem te achterhalen. Het probleem is overigens niet meer urgent omdat ik al in C# het succesvol het programma heb geschreven.

  11. #11
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Van versies tot D2006 is bekend dat de standaard heapmanager (die nog voor 32MB systemen ontworpen zijn, D4..D7 zijn vrij oud) niet goed omgaat met scenarios waar grote arrays (tientallen tot honderden MBs aan elementen) een voor een uitgebreidt worden. Dit leidt tot heapfragmentatie.

    Ik weet niet wie je fastmm aan geraden heeft, maar dat is daar een standaard antwoord op (voor die versies, vanaf D2006 is alles fastmm, dus met XE2 is fastmm DAAR geen oplossing voor)

    Maar je vergelijkingen met C# hebben geen zin. C# gaat op een andere manier met geheugen om (en die methodes hebben andere nadelen)

    En wat delphi betreft, zonder dat je een absolute zekerheid hebt dat je programma correct is, en niet bepaalde beruchte access patronen heeft die tot heapfragmentatie leiden (die een probleem zijn voor alle niet-movable geheugenallocatie strategien), dan hebben je observaties, en dus ook discussie daarover niet zoveel zin

  12. #12
    FastMM heeft logging mogelijkheden voor memoryleaks. Vandaar dat ik dat balletje opgooide.

  13. #13
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Snap ik. Maar als er ruim geheugen vrij is, is het geen leak probleem. Hooguit een fragmentatie probleem.

    Dat kan je wel uit fulldebugmode halen, maar voor een leek is dat moeilijk.

  14. #14
    Senior Member Thaddy's Avatar
    Join Date
    Dec 2004
    Location
    Amsterdam
    Posts
    2,211
    Toch zou ik nog graag een code voorbeeldje willen zien dat dit reproduceert.
    Het gaat een beetje ver om omwille van programmeerfouten een andere taal te kiezen.
    Ook zou ik willen weten of alle updates zijn geinstalleerd?
    Ik heb zelf geen moeite met XE2 op dit gebied.
    Werken aan Ansi support voor Windows is verspilde tijd, behalve voor historici.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •