Objekte - Heap und Stack



  • Was ist das denn für eine Kombination aus Hardware/OS?
    Wenn du die Daten nicht komplett in´s RAM laden kannst musst du sie halt stückweise laden und auswerten. Welche Struktur haben denn deine Daten?



  • DocShoe schrieb:

    Wenn du die Daten nicht komplett in´s RAM laden kannst musst du sie halt stückweise laden und auswerten...

    Und nicht wie in der Praxis schon erlebt, blauäugig komplett einlesen und auch die Analyseergebnisse bis zum Abschluss komplett im Speicher halten (das ging noch gut, als die Dateien wenige MB hatten, bis auf einmal Dateien in fast GB-Größe analysiert werden mussten, und das Analyseergebnis ca. doppelt so groß war => In Zeiten als Rechner noch üblicherweise max. 1 GB Ram hatten).

    Unter Windows gibt es hierfür z.B. die Memory-Mapped Files (Man betrachtet immer nur ein Ausschnitt aus einer Datei).



  • Danke für euer schnelles Feeadback.

    Ich habe ein QNX (UNIX Derivat) System mit 2G RAM
    Ich brauche die kompletten 30MB zur Laufzeit im Speicher.
    Ich möchte nicht während der Laufzeit das File von HD lesen.
    Wäre mir alles zu langsam.

    Ich habe gelesen, dass der Compiler den Heap berechnet. Leider etwas schwierig wenn ich dynamisch allokiere.
    Kann ich trotzdem dem Compiler eine festen Heap mitteilen - über irgendein Flag?
    (GNU-Compiler)

    Wobei ich mir gar nicht sicher bin ob der HEAP überhaupt die richtige Stelle ist.
    Evtl. wären die Daten in einem shared memory besser aufgehoben. Weitere Möglichkeiten habe ich ja unter QNX nicht oder?
    Das memory mapped-file, wie bei Windows gibt es glaub ich nicht. Wobei das echt ne super Lösung wäre.



  • Ach was red ich da für dummes Zeug.
    memory mapped file kann ich auch in QNX machen mit mmap() oder?
    Ist ja alles POSIX *g*

    Ich denke, über solch einen Mechanismus sind große Datenmengen gut aufgehoben und nicht im Heap.
    Was meint ihr?



  • Wenn es ein aktuelles OS ist und die HW 2GB RAM hat kann ich mir nicht vorstellen, dass der Heap nur 26MB gross ist.
    Warum musst du die Daten komplett einlesen? Es wäre wirklich hilfreich, wenn du uns ein bisschen mehr über die Art und Struktur der Daten erzählst, nicht dass du hinterher nur eine CRC32 oder MD5 Hash berechnen willst 😃



  • checkQNX schrieb:

    Ich habe ein QNX (UNIX Derivat) System mit 2G RAM
    Ich brauche die kompletten 30MB zur Laufzeit im Speicher.
    Ich möchte nicht während der Laufzeit das File von HD lesen.
    Wäre mir alles zu langsam.

    Ich habe keine Ahnung von QNX aber mit den mir bekannten 32 bit Linux Distributionen konnte ich immer die vollen 2^32 byte des virtuellen Speichers minus das, was vom Betriebssystem benötigt wird anfordern. In der Praxis etwa 2 GB unabhängig vom der tatsächlichen Größe des RAMs. 26MB scheint mir in jedem Fall sehr wenig zu sein.



  • Du kannst beim Starten deiner Anwendung das File auslesen und das im Heap hinterlegen oder das per mmap machen. Hängt davon ab, was du damit machen willst. Wenn du durch die Daten hindurch iterieren willst, kannst du nur das im Fokus halten, was du brauchst. Wenn du Random-Access benötigst, würde ich das im Heap hinterlegen und den Fall vorsehen, daß deine Files irgendwann zu groß werden.

    Varianten gibt es viele. Auf diese Frage zu antworten ist schwer, wenn man das Problem nicht kennt :).

    Gruß Kimmi



  • Also es lag nicht an der Datenmenge. Mein Heap ist grad sogar bis auf 30MB gewachsen, bis mein Prozess abstürzte.
    Prinzipiell tendiere ich langsam dahin, meine großen Datenstrukturen nicht im Heap sondern in einem anderen Speicherbereich abzulegen.
    Denn ich denke die Abstürze kommen von segmentation faults im Heap.
    Wahrscheinlich kommen da ein paar dyn. Speicherallokierungsvorgänge durcheinander...

    Nur wie sieht das hard coded aus?

    1. fd = open(file)
    2. adr = mmap(fd)
    3. structpointer = adr

    Jetzt kann ich die Daten über "*structpointer" verwenden, ohne erneut auf die Festplatte zuzugreifen.
    Ist das so richtig?
    Wäre ja echt genial 😃



  • checkQNX schrieb:

    Also es lag nicht an der Datenmenge. Mein Heap ist grad sogar bis auf 30MB gewachsen, bis mein Prozess abstürzte.

    Du kannst recht einfach testen ob dir der Heap Speicher ausgeht: Wenn du mit std::set_new_handler() einen handler registrierst, wird dieser aufgerufen, falls die Speicherreservierung fehlschlägt.
    Der Fehler liegt aber mit Sicherheit wo anders. Bei dynamischer Speicherallokierung muss man sich natürlich mehr Gedanken machen.



  • Kannst du im Debugger sehen, ob bei deinen Zugriffen irgendwelche SEGVAULTs auftreten? Vielleicht liegt der fehler ja im Zugriff auf deine Datenstruktur. Und so ein Fehler wird auch auftreten, wenn du den Stack benutzt.

    Gruß Kimmi



  • Ich habe gelesen, dass der Compiler den Heap berechnet.

    Nein. Er legt eigentlich nur die Stackgroesse fest.

    Mein Heap ist grad sogar bis auf 30MB gewachsen, bis mein Prozess abstürzte.

    Wahrscheinlich liegt der Fehler ganz woanders.



  • Danke für die Info.

    Bisher habe ich
    - dynamisch Speicher allokiert
    - Block gelesen
    - dynamsich Speicher allokiert
    - Blcok gelesen
    - ...

    Mit mmap mach ich das alles mit einem Schritt machen.

    Ich denke schon, dass das stabiler und schneller geht.
    Halte euch auf dem laufenden 🙂


Anmelden zum Antworten