Announcement

Collapse
No announcement yet.

Maximale Anzahl der Element in einer Liste

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • #16
    Hallo,

    welche mir hilft die genaue Größe an Bytes oder Bits eines Objekt zu bekommen. Weiß da jemand was?
    Mit GC.GetTotalMemory kannst du die Größe bestimmen, einmal vorher und einmal nachher messen -> Differenz ist die Größe.
    Schau dir auch mal Source-Code-Stepping an, dann kannst du beim Debuggen die List<T> auch durchschreiten.

    Eine Begründung warum es so ist wie es ist, kann ich dir jetzt nicht geben, da ich zum Reindenken gerade keine Zeit habe.

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #17
      GC.GetTotalMemory gibt mir nur die Größe des gesamten Prozess. Schein bar gibt es keine fertige Funktion welche das macht.
      Dennoch habe ich GC.GetTotalMemory in meinem Testprogramm benutzt, und es deckt sich mit den Informationen von Ralf Jansen.
      Dennoch habe ich keine konkrete Antwort was dieses seltsame verhalten der Listen verursacht.

      Comment


      • #18
        Hallo,

        GC.GetTotalMemory gibt mir nur die Größe des gesamten Prozess
        deshalb hab ich ja extra "einmal vorher und einmal nachher messen -> Differenz ist die Größe" geschrieben :-)

        Schau dir mal den Quellcode der List<T> an (entweder mit ILSpy od. du holst dir die Reference Source von MS) und dann wird sich das schon erklären lassen. Bedenke auch dass bei einem .net-Objekt auch Metadaten gespeichert werden. Siehe für ein Array (das ja der List<T> zugrunde liegt) auch Arrays initialisieren


        mfG Gü
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment


        • #19
          Aber enthält die Liste nicht einfach nur Pointer, welche nur 4 byte groß sind?
          Bei Referenztypen. Bei Valuetypen direkt den Value. Bei deiner List<Int> also wirklich die Integer und keine Pointer auf Integer.

          Dann ist es evtl eine "Doubly linked list".
          Es ist ein Array. Ein Double Linked List wäre viel zu langsam für den direkten indexbasierten Zugriff. Bräuchte dafür aber keinen zusammenhängenden Speicher. Will sagen wäre es eine Double Linked List dann hättest du nicht das Problem das du hast.

          Genau die Zahl bei der es Knallt.
          Nette Rechnung aber wohl eher reine Zahlenmystik

          In den Constructor setzt man ja nur die Kapazität die sie anfänglich haben soll
          Nur? Ein entsprechend großes Array wird sofort allokiert. Und wenn es einen entsprechend freien Adressraum nicht mehr gibt. Peng.

          Um besser Debuggen zu könnnen bräuchte ich eine Funktion, welche mir hilft die genaue Größe an Bytes oder Bits eines Objekt zu bekommen. Weiß da jemand was?
          Definiere genaue Größe. Das ist nur scharf abgrenzbar bei simplen Datentypen wie Integer oder einen Array von simplen Datentypen. Die diversen MemoryProfiler werden dir etwas passendes liefern können. Richtig interpretieren ist dann aber immer noch nötig.

          Wenn ich aber den Integer auf 90000000 setze, erscheint wieder die OutOfMemory Exception. Warum?
          Weil beim überschreiten der maximalen Kapazität ein doppelt so großes neues Array angelegt wird. Du brauchst also in dem Zeitraum in dem das erste jetzt zu kleine Array in das neue größere kopiert wird entsprechend mehr speicher und einen entsprechend größeren Adressraum. Beim überschreiten deines 90M Array wird also ein neues 180M Array erzeugt und eine entsprechend gr0ßer Adressraum war scheinbar nicht mehr (an einem Stück) verfügbar. Bei 80M -> 160M hattest du Glück das halt ein 160M Adressraum noch frei war.

          Ich will nicht raten, ich will nicht schätzen, ich will nicht vermuten. Ich will es wissen!
          Dann musst du dir deine eigene Runtime schreiben(insbesondere wegen dem nicht schätzen wollen Punkt). Das genaue Verhalten ist letztlich Versions (1.0 vs. 2.0 vs. 4.0 vs. 4.5 vs. the next thing) und plattformabhängig (Server OS vs. Client OS). Wenn du Mono, Rotor etc. auch noch mit ins Spiel nimmst kommen da noch mehr Unterschiede ins Spiel. Letztlich ist doch auch nicht wirklich relevant wie es sich genau verhält. Du hast üblicherweise den Prozessraum (Third-Party Code, Virenscanner die ihr eigenes Zeug in den Prozeß injekten ) nicht so unter Kontrolle das dir nicht was anderes mit seinen Speicheranforderungen in die Quere kommt. Den OutOfMemory Fall musst du also sowieso in deiner Fehlerbehandlung berücksichtigen.

          Comment


          • #20
            Danke für die ausführliche Antwort. Meine geistige Umnachtung hat sich gelegt und ich weiß jetzt genauer Bescheid. Ich werde mir evtl noch die Referenz anschauen, aber ich denke ich weiß jetzt genug.
            Vielen Dank für die Antworten!
            Zuletzt editiert von gfoidl; 10.07.2012, 10:36. Reason: Fullquote entfernt

            Comment

            Working...
            X