Maximum Size from a Array

  • VB.NET
  • .NET (FX) 4.0

Es gibt 31 Antworten in diesem Thema. Der letzte Beitrag () ist von exc-jdbi.

    Byte-Array könnte evtl. theoretisch fast möglich sein mit int-Max hinzubekommen.
    Fangen wir mal an, dass du mit 32-Bit OS im RAM nicht mehr als 2^32 Byte speicher ansprechen kannst. Dann braucht das OS noch was und das Speichermanagement natürlich auch, also bleiben dir effektiv vmtl. um die 3,5GB. Wobei ein einzelnes Objekt mit 2GB begrenzt wurde. Ausnahmen gibt es dann seit 4.5...
    Aber bei einem array ist der Indizierer nunmal int, da macht es sowieso keinen Sinn etwas größer als int.MaxValue möglich zu machen.(Zumindest bei Byte, alles was größer als Byte ist hat natürlich auch weniger indizes)...

    Jetzt hast du bei deinem OS natürlich nicht sonderlich viel mehr als 3,5GB, dies sorgt dafür, dass dein OS deiner Anwendung natürlich nicht gleich allen Speicher gibt sondern nur einen Teil zur Verfügung stellt, das sorgt sehr wahrscheinlich dafür, dass deine Anwendung nichtmal 2GB zur Verfügung hat und dein einzelnes Array natürlich noch weniger...

    Also ergeben größere Arrays bei 32Bit sowieso keinen Sinn.

    Vlt. wäre es einmal eine Überlegung wert dir ein 64Bit PC anzuschaffen, ich dachte 32-Bit wäre schon ausgestorben bis auf PS :D
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Ich kann hier leider gar nicht helfen. Bin jedoch immer dabei wenn es noch was zu lernen gibt. Daher täte es mich interessieren wozu man soetwas „wissen/berechnen“ muss und was mir dieses Wissen dann bringt. Gibts da nen konkreten Anwendungsfall?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    exc-jdbi schrieb:

    Bei meinem Visualstudio gibt es Prefer 32 nicht
    ist bei mir (W10-64) disabled:

    Dann mach doch einfach ein x86-Projekt daus:
    Erstellen => Konfigurationsmanager =>

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Guten Morgen :)

    UNd danke für die Antworten.

    @jvbsl
    Das macht natürlich voll Sinn. Erklärt auch, warum schon bei "int.maxvalue / 100" ein 'System.OutOfMemoryException' geworfen wird.

    @RodFromGermany
    Das habe ich naürlich alles schon ausprobiert. Es ist mit meiner Version wirklich nicht möglich, entsprechende Änderungen vorzunehmen.

    @mrMo
    Da fallen mir gleich ein paar Möglichkeiten ein.
    - Bildverarbeitung
    - Wo keine DB erwünscht ist, z.B. aus Performencegründen
    - Mathematische Berechnungen, die kurzzeitig eine solche Array brauchen.

    Ich habe übrigends heute morgen einen jungfräulichen Testlauf gemacht, und konnte "int.maxvalue / 10" instanzieren. Leider nur wenige Male, nachher hat das nicht mehr geklappt. Geschwindigkeitsgewinn rund 350 ms. Ich werde die ganze Strategie zum Aufbau sowieso nochmals überdenken müssen.

    Es läuft prima,nur einfach sehr langsam. Wenn ich mal lust habe, werde ich es nochmals in Angriff nehmen.

    Hiermit ist das Thema für mich erledigt. Ich geh davon aus, dass es keine Möglichkeit gibt einen maximalen Wert vom System zu bekommen. Nicht auf meinem System. Ab FW4.5 gibt es das gcAllowVeryLargeObjects. Wie weit jedoch das eingesetzt werden kann, habe ich noch nicht ausprobiert.

    Approppo neues System zulegen. Solange mein Laptop schnurrt wie ein Kätzchen, und sonst einwansdfrei läuft, sehe ich keinen Bedarf etwas Neus anzuschaffen.


    Fruendliche Grüsse

    exc-jdbi
    gcAllowVeryLargeObjects erlaubt dir nicht ein Array größer int.MaxValue zu machen.
    byte[int.MaxValue] ist theoretisch möglich ohne gcAllowVeryLargeObjects, größer geht es auch nicht mit
    ushort[int.MaxValue/2] ist möglich für ushort mit gcAllowVeryLargeObjects wäre ushort[int.MaxValue] möglich
    dasselbe kann man fortführen wür int/float/double etc und für andere Wertetypen. Es erhöht nur die Maximalgröße eines aufeinmal allokierten Objektes.

    Aber auf deinem System nützt d sowieso alles nichts mehr. Wenn es um Performance geht, dann bin ich mir relativ sicher ist das Problem erstmal woanders. Wenn du tatsächlich Random Access brauchst, also z.B. erst am Anfang und dann am Ende deines BigArrays und dann irgendwo sonst zufällig und du nicht vorhersagen kannst wo der nächste Zugriff stattfinden wird, dann mag ein solch großes Array tatsächlich nötig sein.
    Ist dies nicht der Fall, dann solltest du eher die Daten von der Festplatte Laden wenn sie benötigt werden und die, die nicht mehr benötigt werden wieder entladen. Am besten dasselbe Array wiederverwenden, dann bekommst du auch kein ausversehenes OutOfMemory, wenn der GC gerade mal mit aufräumen nicht schnell genug ist. Falls es zwar überall beliebig im Array ist, aber du vorhersagen kannst an welchen stellen, dann solltest du versuchen das Array entsprechend um zu sortieren und für immer so zu lassen...

    Wenn das Laden von der Platte nicht schnell genug sein sollte, dann solltest du dir erst überlegen ob du den Ladeprozess verschnellern kannst(keine Serialisierung verwenden, manuell schreiben und wichtig: binär am besten so wie es im Memory steht sequentiell). Wenn es dann immer noch nicht reichen sollte wäre es eine Überlegung Memory-Mapped-Files zu verwenden, bei welchen das System probiert die zu Ladende Datei komplett in RAM zu laden, aus welchem sie wie eine normale Datei geladen werden kann. Falls die Datei nicht komplett rein passt, wird der rest der Datei auf der Platte gelassen und erst bei bedarf geladen...

    Aber als aller erstes ist die Überlegung ob dein Algorithmus nicht einfach nur Optimierungsbedarf hat...

    Edit: @mrMo ich versteh nicht genau was du meinst. 32Bit -> 2^32 ist einfach nur die Berechnung wie viele unterschiedliche Werte mit 32-Bit dargestellt werden können. Und ein 32-Bit System arbeitet mit 32-Bit Addressierung, wobei je eine Erhöhung der Adresse um eine Einheit(1) um die Adressierung des nächsten Bytes entspricht. Wir sprechen nämlich auf aktuellen Systemen alle Daten Byte-weise an. Deshalb ist 2^32 auch die maximale größe, die mit dieser Addressierung im Speicher angesprochen werden kann...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    @jvbsl wie meist du das von der Festplatte?

    Irgend so was wie MemoryMappedFile? Das wäre bei mir noch möglich.

    Edit:
    Sorry: hab gerade gsehen, genau das hast du ja geschrieben :)
    Ich habe soeben heute morgen das angeschaut, und ich fand das noch ziemlich interessant. Ich werde mich auf jedenfall in dieses Thema einarbeiten. Dies würde natürlich eine entsprechende Optimierung angepasst auf das MMF mitbringen, was so auf den ersten Blick auch aus meiner Sicht noch umsetzbar wäre.


    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „exc-jdbi“ ()

    Ich will nur nochmal ganz sicher gehen. Bist du sicher, dass du an der richtigen Stelle optimierst?
    Was genau machst du denn, kannst du das genauer beschreiben und deinen bisherigen Algorithmus posten? Dann kann man dir bestimmt besser helfen bei das eigentliche Grundproblem zu beheben und nicht Symptome ;)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    exc-jdbi schrieb:

    Es ist mit meiner Version wirklich nicht möglich, entsprechende Änderungen vorzunehmen.
    Doch, das geht.
    Geh mal Extras - Optionen, da ist irgendwo eine Extensierung der Anzeige, das musst Du aktivieren, und dann kannst Du Dir ne x86 / x64 bauen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @jvbsl
    Den Code kann ich leider nicht hier veröffentlichen, auch wenn ich es gerne täte. Ich bin mir aber sicher, wir würden ein einfaches Beispiel finden, wo das Sinn (vielleicht auch Unsinn) machen würde. Wie zum Beispiel Sieve of Eratosthenes. Die LONG-Version.
    Also alle Primzahlen präsent zu halten bis long.maxvalue oder sogar ulong.maxvalue. z.B. Prime(N).

    @RodFromGermany
    Ein neues (bei mir heisst das) Active Solution Plattform zu machen, geht schon, nur das ändern von prefer 32 geht nicht.





    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „exc-jdbi“ ()

    @exc-jdbi Das meine ich nicht.
    Teste mal diesen hier:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!