Allgemeine Funktion um verfügbaren Speicher zu ermitteln?



  • Hi, mein Programm läuft schneller, falls es mehr Speicher verwenden darf (bis zu einer bestimmten Schwelle). Gibt es eine Möglichkeit das Systemunabhängig zu ermitteln (Win Linux Mac)? I.d.R. ist es dem Anwender des Programms egal, wenn ich all den Speicher haben will.

    Google-Suche hat bisher nur ergeben, dass das je nach OS unterschieldich ist.

    Alternativ könnte man einfach verschieden große Speicher anfordern und schauen, ob man Fehler als Rückmeldung bekommt.

    Bester Lösung bisher: sysconf().
    Das geht glaub ich aber nur unter Linux.

    Jedes mal den Nutzer angeben lassen ist nicht erwünscht, da oft auch schon wenig Speicher ausreicht.



  • Gibt es nicht.


  • Mod

    Wenn der Speicher für eine sequentielle Datenstruktur benötigt wird, probier mal eine std::deque , und vergrößere sie so lange bis bad_alloc fliegt.



  • Einfach Speicher anfordern ist doof, weil es üblicherweise immer noch ein pagefile/-partition gibt, und wenn mal ausgelagert wird, dann wirds langsam. Trotz SSDs.

    Entweder du macht nen Parameter den der Benutzer einfach mitgeben kann, oder du suchst dir die 2-3 verschiedenen OS-Funktionen raus mit denen du das ermitteln kannst. Und "das" sollte dann vermutlich die grösse des physikalisch verfügbaren RAMs sein. Wenn du davon dann alles bis auf ~1 GB nimmst, sollte es auf den meisten Systemen vermutlich gut passen.



  • Alternativ könnte man einfach verschieden große Speicher anfordern und schauen, ob man Fehler als Rückmeldung bekommt.

    naja, kommt wohl drauf an, was für speicher - physical, freien Adressraum, Speicher im zusammenhängenden Block? 32 Bit-Adressraum oder 64 Bit-...?
    Bei 32 Bit ist es durchaus ein Unterschied, ob ein größerer Speicherblock benötigt wird oder viele kleinere.



  • hustbaer schrieb:

    Einfach Speicher anfordern ist doof, weil es üblicherweise immer noch ein pagefile/-partition gibt, und wenn mal ausgelagert wird, dann wirds langsam. Trotz SSDs.

    Das ist doch nur dann der Fall wenn ich mehrere kleine anfordere oder?

    Wenn ich z.B. malloc(1TB), malloc(512GB), malloc(256GB),..., malloc(1GB).
    So lange mache, bis es keinen Nullpointer zurück gibt und dann gleich wieder lösche sollte das doch nur im Arbeitsspeicher sein.

    Ausgelagert würde es doch nur werden, wenn ich sowas wie
    while( malloc(1GB) )
    mache.

    An 32 and 64 bit habe ich noch nicht gedacht. Das ist doch dann von dem System abhängig auf dem es läuft oder?


  • Mod

    Mem O. Ry schrieb:

    hustbaer schrieb:

    Einfach Speicher anfordern ist doof, weil es üblicherweise immer noch ein pagefile/-partition gibt, und wenn mal ausgelagert wird, dann wirds langsam. Trotz SSDs.

    Das ist doch nur dann der Fall wenn ich mehrere kleine anfordere oder?

    Wenn ich z.B. malloc(1TB), malloc(512GB), malloc(256GB),..., malloc(1GB).
    So lange mache, bis es keinen Nullpointer zurück gibt und dann gleich wieder lösche sollte das doch nur im Arbeitsspeicher sein.

    Ausgelagert würde es doch nur werden, wenn ich sowas wie
    while( malloc(1GB) )
    mache.

    An 32 and 64 bit habe ich noch nicht gedacht. Das ist doch dann von dem System abhängig auf dem es läuft oder?

    Dein Vorschlag funktioniert nicht, weil das reine malloc-Speichermanagerlogik ist (also auf Ebene deiner Anwendung), aber noch überhaupt kein Mapping auf Ebene des Betriebssystems/Hardware stattfindet. Aber um die geht es bei der Frage doch. Du stellst damit hauptsächlich fest, wie groß der größte freie Block im virtuellen Adressraum deiner Anwendung ist. Ein tatsächliches Mapping auf physische Adressen im RAM oder auf der Festplatte wird bei den üblichen Betriebssystemen erst erfolgen, wenn du eine Speicherseite auch tatsächlich benutzt.

    Aber selbst wenn das Mapping auf physische Adressen kein Problem wäre, dann ist bei deinem Vorschlag doch auch kein Unterschied zu dem Vorschlag, den du verbessern möchtest. Beide machen malloc, bis es nicht mehr funktioniert. Was soll die Verbesserung bei deinem sein? Ob in großen oder in kleinen Stücken gemalloct wird, macht bei dieser Frage doch keinen Unterschied.



  • Mem O. Ry schrieb:

    hustbaer schrieb:

    Einfach Speicher anfordern ist doof, weil es üblicherweise immer noch ein pagefile/-partition gibt, und wenn mal ausgelagert wird, dann wirds langsam. Trotz SSDs.

    Das ist doch nur dann der Fall wenn ich mehrere kleine anfordere oder?

    Nope.

    Mem O. Ry schrieb:

    Wenn ich z.B. malloc(1TB), malloc(512GB), malloc(256GB),..., malloc(1GB).
    So lange mache, bis es keinen Nullpointer zurück gibt und dann gleich wieder lösche sollte das doch nur im Arbeitsspeicher sein.

    Wenn das Pagefile/die Paging-Partition gross genug ist, dann bekommst du auch bei malloc(1TB) keinen NULL Pointer zurück sondern die gewünschten 1TB Speicher. Dass die im Rechner gar nicht drinnen sind ist dabei egal. Virtueller Speicher halt. Ob du wenig zusammenhängende grosse Blöcke anforderst oder viele kleine ist - was dieses Thema angeht - Wurst.
    Unterschied macht das nur bezüglich Fragmentierung des Adressraums. Was natürlich speziell bei 32 Bit ein Problem ist. Da ist es schon mutig mit 500 MB "am Stück" zu rechnen.


Anmelden zum Antworten