new [] - bad alloc bei 2GB?
-
@Kontrasubjekt: OK, ich glaube ich verstehe jetzt was du meinst/willst

Allerdings hab ich die Bibliotheken nicht zu den 1.95 GB mitgezählt. Vielleicht haben die den Unterschied gemacht.
Sind wie gesagt nicht nur die DLLs, sondern auch noch andere Dinge.
Guck dir einfach mal einen Prozess im VMMap an, dann siehst du recht gut was da wo liegt. Hier nochmal der Link:
http://technet.microsoft.com/en-us/sysinternals/dd535533.aspxIch möchte eine Möglichkeit finden, mit oder ohne LAA mehr prozent des verfügbaren Raums zu bekommen. Denn wie ich das verstanden hab ändert LAA nichts an der Fragmentierung.
Das wird vermutlich so sein, ja.
Ziel ist möglichst zu garantieren, dass Verfügbarer Speicher minus einige 100MB sicherheit bereitgestellt werden. Verstehst du nun?
Jopp.
Dann bleibt dir aber vermutlich nichts anderes übrig, als kleine Stücke anzufordern.
Vielleicht in einer eigenen deque-ähnlichen Datenstruktur. ca. so:static const size_t PageSize = 64 * 1024; struct Page { int Elements[PageSize]; }; struct MyArray { std::vector<Page*> m_pages; int& operator[](size_t n) { return m_pages[n / PageSize]->Elements[n % PageSize]; } };Der Zugriff sollte so relativ schnell sein. Wenn du PageSize als Zweierpotenz definierst, dann wird die Divison zu einem Shift und der Modulo zu einem AND. Also beides sehr billige Operationen.
Ist jetzt natürlich bloss ein Beispiel. Ich weiss ja nicht welche Operationen (ausser Random-Access) du auf der Datenstruktur noch brauchst, und welche davon wirklich schnell sein müssen.
Grund: selbst wenn du es auf deinem System hinbekommst, dass z.B. 1,7GB am Stück frei sind, muss das nicht auf allen Systemen funktionieren. Es könnten z.B. Programme installiert sein die DLLs in sämtliche Prozesse injecten. Wenn eine solche DLL dann "blöd liegt", kann es sein, dass du auf einmal statt 1,7GB bloss noch 1,3GB am Stück bekommst. Sehr häufig wird es vermutlich nicht vorkommen, aber wie gesagt: verlassen kannst du dich nicht darauf.
Grundsätzlich: je näher du an die Grenze gehst, desto höher sind die Chancen, dass du auf anderen Systemen Probleme haben wirst.Und das LAA Bit würde ich auf jeden Fall setzen. Wenns nix bringt, kanns kaum was schaden

-
Willst du uns mal sagen was dein Programm mal können soll, außer viel Speicher brauchen. I wette, dass das was du vor hast auch mit viel weniger Speicher geht.
-
wetten dass schrieb:
Willst du uns mal sagen was dein Programm mal können soll, außer viel Speicher brauchen. I wette, dass das was du vor hast auch mit viel weniger Speicher geht.
Er möchte einen Software Renderer mit GPU Beschleunigung schreiben, so paradox dies auch klingen mag:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-249954-and-highlight-is-.html
-
Kontrasubjekt schrieb:
Ich verstehe noch nicht, wieso ich bei 32 bit x MB und bei 64 mehr bekommen soll, obwohl x noch unter 2GB liegt.
Dein Programm alloziert garantiert anderweitig schon Speicher, und das ist bei 64Bit dann kein Problem mehr, weil der gesamte Adreßraum deutlich größer ist. Also, was soll der Schmarrn, mach eine 64Bit Applikation draus. Alles andere ist nur Frickelei.
-
hustbaer schrieb:
Der Zugriff sollte so relativ schnell sein. Wenn du PageSize als Zweierpotenz definierst, dann wird die Divison zu einem Shift und der Modulo zu einem AND. Also beides sehr billige Operationen.
Ist jetzt natürlich bloss ein Beispiel. Ich weiss ja nicht welche Operationen (ausser Random-Access) du auf der Datenstruktur noch brauchst, und welche davon wirklich schnell sein müssen.
Leider alle. Zweierpotenz werd ich berücksichtigen, gute Idee.

Ich schätze ich habe bessere Chancen wenn ich vorher eine Ram defrag durchführen lasse, oder?
-
~john schrieb:
Also, was soll der Schmarrn, mach eine 64Bit Applikation draus. Alles andere ist nur Frickelei.
Das widerspricht ja der Vorgabe, dass die Anwendung auch unter x86 laufen soll. Andererseits widerspricht dem der Wunsch, 2 GB am Stück zu allozieren... toll, jetzt bin ich verwirrt...

-
Vielleicht sollte er einfach sein Softwarekonzept nochmal überdenken.
Ich kenne 3 Leute, die sich mit Renderen beschäftigen und keiner von denen wollte jemals 2GB allokieren...
-
Kontrasubjekt schrieb:
hustbaer schrieb:
Der Zugriff sollte so relativ schnell sein. Wenn du PageSize als Zweierpotenz definierst, dann wird die Divison zu einem Shift und der Modulo zu einem AND. Also beides sehr billige Operationen.
Ist jetzt natürlich bloss ein Beispiel. Ich weiss ja nicht welche Operationen (ausser Random-Access) du auf der Datenstruktur noch brauchst, und welche davon wirklich schnell sein müssen.
Leider alle. Zweierpotenz werd ich berücksichtigen, gute Idee.

Ich schätze ich habe bessere Chancen wenn ich vorher eine Ram defrag durchführen lasse, oder?
RAM Defrag gibt's nicht. Tools die sowas angeblich können, lügen.
-
hustbaer schrieb:
Kontrasubjekt schrieb:
hustbaer schrieb:
Der Zugriff sollte so relativ schnell sein. Wenn du PageSize als Zweierpotenz definierst, dann wird die Divison zu einem Shift und der Modulo zu einem AND. Also beides sehr billige Operationen.
Ist jetzt natürlich bloss ein Beispiel. Ich weiss ja nicht welche Operationen (ausser Random-Access) du auf der Datenstruktur noch brauchst, und welche davon wirklich schnell sein müssen.
Leider alle. Zweierpotenz werd ich berücksichtigen, gute Idee.

Ich schätze ich habe bessere Chancen wenn ich vorher eine Ram defrag durchführen lasse, oder?
RAM Defrag gibt's nicht. Tools die sowas angeblich können, lügen.
Und ich hab mich schon ewig gefragt, wie die das wohl machen...
Was machen dann so ne Tools überhaupt?bb
-
unskilled schrieb:
Und ich hab mich schon ewig gefragt, wie die das wohl machen...
Was machen dann so ne Tools überhaupt?bb
http://www.chip.de/artikel/Geprueft-Diese-Tuning-Tools-helfen-wirklich-6_30428390.html
Ziemlich billig, und im Anschluss dürfte es ewig dauern, bis der ganze Kram, der benötigt wird, wieder von der Auslagerungsdatei zurückgeschaufelt wurde...
-
_matze schrieb:
unskilled schrieb:
Und ich hab mich schon ewig gefragt, wie die das wohl machen...
Was machen dann so ne Tools überhaupt?bb
http://www.chip.de/artikel/Geprueft-Diese-Tuning-Tools-helfen-wirklich-6_30428390.html
Ziemlich billig, und im Anschluss dürfte es ewig dauern, bis der ganze Kram, der benötigt wird, wieder von der Auslagerungsdatei zurückgeschaufelt wurde...
Jopp - imho war das aber nur _ein_ Weg?! Hatte mich vor Ewigkeiten mal damit beschäftigt und ich dachte, dass die meisten RAM-Tools noch eine andere Option geboten hätten, die ich aber nie ganz verstanden hatte xD
bb
-
Wenn ich sowas hier lese, wird mir echt schlecht: http://tipps4you.de/tipp-153-winxp.html (das ist wohl die "Nullen-Mwthode" auf's Wesentliche reduziert...)

-
It0101 schrieb:
Vielleicht sollte er einfach sein Softwarekonzept nochmal überdenken.
Ich kenne 3 Leute, die sich mit Renderen beschäftigen und keiner von denen wollte jemals 2GB allokieren...
Vielleicht braucht er garkeine 2GB, sondern will bloss das Maximum rausholen. Was auch immer das Maximum ist.
Keine Ahnung.
Sagt er leider nicht

-
_matze schrieb:
Das widerspricht ja der Vorgabe, dass die Anwendung auch unter x86 laufen soll. Andererseits widerspricht dem der Wunsch, 2 GB am Stück zu allozieren... toll, jetzt bin ich verwirrt...

Eine der beiden Vorgaben ist unrealistisch.
-
Warum nehmt Ihr eigentlich an, man können mehr Speicher bekommen, wenn man den Speicher nicht am Stück haben muß? Kennt jemand eine Freispeicherimplementierung, wo der Freispeicher nicht am Stück ist?
-
volkard schrieb:
Warum nehmt Ihr eigentlich an, man können mehr Speicher bekommen, wenn man den Speicher nicht am Stück haben muß? Kennt jemand eine Freispeicherimplementierung, wo der Freispeicher nicht am Stück ist?
Äh.
Alle?
Unter Windows ist es garantiert so. Kannst du ja ausprobieren wenn dus nicht glaubst.
-
Mein Windows ist wohl kaputt. Ich kriege mit wiederholtem kleinen VirtualAlloc nicht mehr Speicher als bei einem großen. Vielleicht habe ich nur mit der Hardware Glück gehabt.
-
Vielleicht solltest du mal deinen Rechner ordentlich ran nehmen, damit der Speicher wieder ordenrtlich durchfragmentiert wird.
-
Defragminator schrieb:
Vielleicht solltest du mal deinen Rechner ordentlich ran nehmen, damit der Speicher wieder ordenrtlich durchfragmentiert wird.

-
Defragminator schrieb:
Vielleicht solltest du mal deinen Rechner ordentlich ran nehmen, damit der Speicher wieder ordenrtlich durchfragmentiert wird.
Das hilft ja nichts. Selbst wenn ich in den physikalischen Speicher Knoten mache, werden dessen Speicherseiten in den virtuellen Speicher des neuen Prozesses nicht fragmentiert eingeblendet, wozu auch?
Fragmentierung in meinem Prozess bekomme ich durch eigene new-Aufrufe, wenn ich es drauf anlege. Das ist bestimmt nicht der Fall, wenn ich nur frühzeitig einen großen Happen Speicher anlege.