Große Anzahl von Zahlen
-
Hallo,
ich habe ein Problem: ich habe ein Array dessen Elemente entweder wahr oder
falsch sind. Mein Programm rechnet damit. Bis zu 100.000.000 Elementen gings
noch, aber danach streikt der Computer. Weiß jemand wie ich dieses Riesige
Array irgendwie umformen kann? Ich habe mir gedacht man könnte irgendwie alle
hintereinander reihen in einem String oder so. Im String könnte man ja die
Elemente wieder mit []-Operator ansprechen, aber würde das wirklich weniger
Speicher benötigen? String arbeitet intern auch mit Arrays, oder?Vielen Dank!
-
Aus Neugier: Wozu brauchst Du denn so dermaßen viele Werte? Normal ist das nicht.
Bei solchen Größen streikt übrigens auch der RAM, wie Du Dir leicht ausrechnen kannst. Da hilft nur, Teile des Arrays nacheinander zu laden und abzuarbeiten. Alles gleichzeitig im Speicher zu halten ist Wahnsinn.
-
Wie viel RAM hast du denn?
Kannst ja mal rechnen bool benutz auch 1 byte... kannst ja mal rechnen.
-
Weiß schon. Hab mir auch schon überlegt der Reihe nach das zu machen. Könnte
aber etwas schwierig werden.
-
Ah sry, ich habe jetzt eine Lösung: ich lösche einfach alle 0-Werte aus einem
Vector und die anderen Werte besitzen als Wert die Zahl (wo ich vorher
mit der Indexnummer gearbeitet habe). Damit dürfte die Größe nur noch 1/20
von vorher betragen.
-
Das sind keine 12 MiB, wo ist das Problem?
-
Ich würde mal sagen, dass es zuviel ist. Auch wenn es den RAM nicht füllt, braucht es ja auch Zeit die Werte dort reinzubringen. Und wenn er das für jedes Frame macht..
-
Entenwickler schrieb:
Das sind keine 12 MiB, wo ist das Problem?
Wenn man das Array auf dem Stack anlegt vielleicht, ansonsten eher nicht.
@D:
Du verwendest doch std::vector<bool>, oder? Der benutzt nur ein Bit pro bool-Wert, was bei vielen Werten doch Platz sparender ist.
-
Ich weiß nicht, wie das intern verwaltet wird, aber wie wärs denn mit einem
std::bitset< 1000000 > bs;Das sollte doch wenigstens speicherschonender zu verwenden sein...
-
mbu schrieb:
Ich weiß nicht, wie das intern verwaltet wird, aber wie wärs denn mit einem
std::bitset< 1000000 > bs;Das sollte doch wenigstens speicherschonender zu verwenden sein...
Ja, nur dass Dir zwei Größenordnungen fehlen.

Ist aber egal. Die Ente hat recht, das sind „nur“ 12 MiB, damit lässt sich noch gut arbeiten, wenn man die Daten erst einmal eingelesen hat.