Wie reserviere ich Speicher für meine Anwendung und lasse einen bestimmten Restbetrag übrig?

8

Ich plane eine Anwendung, bei der viele Bilder gleichzeitig geladen werden müssen und somit ein großer Speicherbedarf besteht. Zum Beispiel könnte ich 50 Bildobjekte auf einmal erstellen, die insgesamt 1 GB RAM benötigen. Aber wenn der Benutzer 20 weitere Bilder laden möchte, möchte ich sicherstellen, dass die Speichermenge bereits reserviert und bereit ist.

Nun scheint dieser Teil ein bisschen rückwärts von der Norm zu sein. Anstatt zu spezifizieren, wie viel Speicher meine Anwendung reservieren soll, muss ich stattdessen angeben, wie viel Speicher für andere Anwendungen frei bleibt, und den Speicher meiner Anwendung gemäß dieser Spezifikation periodisch anpassen. Ich muss sagen, dass ich noch nie mit der Reservierung von Speicher gearbeitet habe, und insbesondere nicht wissen werde, wie ich diesen verbleibenden verfügbaren Speicher belassen kann.

Wenn beispielsweise der Computer über 2048 MB RAM verfügt und die Option 50 MB für andere Anwendungen frei lässt und bereits 10 MB RAM von anderen Apps verwendet werden, sollten 2048-50 reserviert werden -10 = 1988 MB für meine App.

Ich gehe davon aus, dass der Benutzer eine andere Anwendung öffnet, die 1 GB benötigt. Meine App muss dies erfassen und sich selbst verkleinern.

Klingt das überhaupt nach einem machbaren Ansatz? Grundsätzlich muss ich sicherstellen, dass zu jedem Zeitpunkt so viel Speicher wie möglich reserviert ist, während ein angemessener Betrag für andere Apps verfügbar bleibt. Würde es einen erheblichen Einfluss auf die Leistung haben, wenn ich das mache oder nicht viel? Ich werde Bilder mit schnellen Schritten laden und entladen, und ich will nicht, dass es diese Erinnerung bei Bedarf reserviert / freigibt, ich möchte, dass es reserviert bleibt.

    
Jerry Dodge 23.12.2011, 22:07
quelle

2 Antworten

8

+1 für Sertacs Erwähnung, wie SQL Server die erforderliche Speicherzuweisung ausführt, aber Speicher freigibt, wenn Windows sich beschwert.

Anwendungen können Beschwerden von Windows erhalten, indem sie die CreateMemoryResourceNotification :

%Vor%
  

Anwendungen können Speicherressourcenbenachrichtigungsereignisse zum Skalieren der   Speichernutzung als angemessen. Wenn der verfügbare Speicherplatz niedrig ist, wird der   Anwendung kann seinen Arbeitssatz reduzieren. Wenn der verfügbare Speicherplatz hoch ist,   Die Anwendung kann mehr Speicher zuweisen.

     

Jeder Thread des Aufrufenden   Der Prozess kann den Speicherressourcen-Benachrichtigungs-Handle in einem Aufruf angeben   zur QueryMemoryResourceNotification Funktion oder eine der Wartefunktionen .   Der Status des Objekts wird bei der Angabe signalisiert   Speicherbedingung existiert. Dies ist ein systemweites Ereignis, also alles   Anwendungen erhalten eine Benachrichtigung, wenn das Objekt signalisiert wird. Hinweis   dass es einen Bereich von Speicherverfügbarkeit gibt, wo weder der    LowMemoryResourceNotification oder HighMemoryResourceNotification -Objekt   wird signalisiert. In diesem Fall sollten Anwendungen versuchen, die   Speicherverwendungskonstante.

Aber es ist auch erwähnenswert, dass Sie genauso gut Speicherplatz reservieren können, den Sie brauchen. Ihr Betriebssystem verfügt über einen sehr ausgeklügelten Satz von Algorithmen, um den am wenigsten genutzten Speicher bei hohem Speicherdruck auszutauschen. Sie können dies nutzen, indem Sie einfach den gesamten benötigten Speicher zuweisen. Wenn Windows langsam zu laufen beginnt, wird es die Seiten des Arbeitsspeichers, die Sie am wenigsten verwenden, finden und sie auf die Festplatte auslagern. ( So funktioniert ein bekannter Reverse-Proxy ).

Sie müssen nur noch entscheiden, ob Sie einige Bilder freigeben möchten, wenn Windows sagt, dass der Arbeitsspeicher knapp wird. Aber wenn Sie den Speicher nicht verwenden, wird er für Sie auf die Festplatte ausgelagert.

    
Ian Boyd 24.12.2011, 04:07
quelle
7

Es ist nicht realistisch, andere Apps zu berücksichtigen. Ignorier Sie einfach. Das System blendet die Dinge nach Bedarf ein und aus. Wenn Sie dies wirklich tun möchten, müssen Sie sich dynamisch an andere Prozesse anpassen, wenn diese beginnen und enden. Das ist wirklich nicht realistisch. Darüber hinaus ist es nicht praktisch, bei anderen Prozessen nachzufragen, wie viel Speicher sie benötigen. Überlassen Sie alles dem System.

Legen Sie ein Budget für Ihre App fest und stellen Sie sicher, dass Sie das Budget nicht überschreiten. Behalten Sie die zuletzt verwendeten Bilder im Speicher und wenn Sie sich Ihrem Speicher-Budget nähern, werfen Sie die zuletzt verwendeten Bilder weg, um Platz zu schaffen.

Wenn Sie die verfügbaren Ressourcen betonen, stellen Sie sicher, dass Sie FastMM verwenden und LARGE_ADDRESS_AWARE für Ihre App aktivieren, damit Sie 4 GB Adressraum erhalten, wenn Sie auf einem 64-Bit-Betriebssystem arbeiten.

    
David Heffernan 23.12.2011 22:11
quelle