2012-03-30 1 views
2

Ich arbeite mit einer Open-Source-.NET-Anwendung, die viel Zeit zum Starten und Initialisieren benötigt. Es erstellt Tausende von Objekten und konfiguriert sie für den ersten Gebrauch. Ich versuche diese Startzeit zu verbessern.Aufzeichnen und Wiederherstellen des Anwendungsstatus für den schnellen Start von .NET-Anwendungen

Gibt es eine Möglichkeit Anwendungsspeicher mit der Windows-API oder ähnlich zu erfassen, und dann schnell „wiederherstellen“ diesen Zustand später nach dem Neustart des PC? Gibt es im Wesentlichen eine Möglichkeit, auf den zugrunde liegenden Speicher einer .NET-Anwendung zuzugreifen und sie zu speichern, und die CLR diesen Speicher zu einem späteren Zeitpunkt "absorbieren" zu lassen?

  • Der einfachste Weg wäre Windows-Hibernate verwenden „hiberfile.sys“, zu erstellen und dann eine Kopie dieser Datei zu speichern (wenn das möglich ist). Jedes Mal, wenn Windows gestartet wird, überschreiben Sie die vorhandene Hiberdatei mit der gespeicherten "sauberen" Version für den nächsten Start. Dies stellt sicher, dass Sie den Anwendungsstatus speichern/wiederherstellen können, ohne mit Speicher, Zeigern und Handles umgehen zu müssen. Könnte das funktionieren?

  • Eine Möglichkeit wäre eine mem-Platte erschaffen, obwohl ich weiß nicht, ob die Wiederherstellung möglich ist. (Virtueller Speicher, der funktioniert off tatsächlich die Festplatte, so dass der Speicher als einfache Datei wiederhergestellt gespeichert/zu)

  • Ähnlich this Frage, aber ein bisschen anders, da ich nichts dagegen, wieder Einsetzen des Applikationsspeicher an die genaue Adresse, in der es gespeichert wurde. Der PC ist vollständig in meinen Händen und der Einfachheit halber angenommen, dass keine anderen Apps laufen.

  • C# unterstützt continuation out-of-the-box nicht, obwohl Workflow Foundation in .NET 3.0 und höher ermöglicht, Workflows zu stoppen und neu zu starten. Ich frage mich, wie sich eine Anwendung als Workflow verhalten kann.

  • Raymond Chen argumentiert dagegen in einer blog post, aber auch nicht viele technische Daten hier.

  • YAPM kann ein Open-Source-Prozessmonitor die Speicherbereiche im virtuellen Speicherbereich eines Prozesses anzeigen/freigeben/ändern/freigeben/freigeben. Könnte das etwas ähnlich dem sein, wonach ich suche?

+1

Ich denke, das Beste, was Sie tun können, ist binäre Serialisierung und Deserialisierung –

+0

Raymond Chens Artikel gibt technische Daten, einschließlich ein paar sehr wichtige Beispiele (der Rest des Systems nicht überwintert, möglicherweise alle externen Handles und Ressourcen ungültig). – ssube

Antwort

2

Wenn Sie ein unveränderter wollen/Ladevorgang speichert ersten Gebrauch zu vermeiden, können Sie in serialization suchen.

Eigentlich könnte das Speichern des Speichers möglich sein, aber Sie werden Adressprobleme beim Versuch, es wiederherzustellen, und es besteht die Möglichkeit, dass Sie möglicherweise nicht genügend Arbeitsspeicher haben, keinen freien Block in der gleichen Größe haben, oder bald.

Serialisierung auf Objektebene oder sogar eine große Gruppe von Objekten ermöglicht es Ihnen, sie und ihren Zustand auf fast identische Weise zu Dumping-Speicher zu speichern, aber den Ladevorgang erheblich vereinfachen und es viel zuverlässiger. .Net bietet ziemlich gute Serialisierungsunterstützung und kann in Binärdateien (klein aber versionsabhängig) oder XML (größer, lesbar, etwas flexibler) ausgeben. Andere Bibliotheken bieten möglicherweise mehr Methoden zur unterschiedlichen Verwendung an (ich glaube, es gibt eine JSON-Version, die noch etwas ausführlicher ist, aber mit Web-Apps funktioniert).

Je nachdem, wie Ihre App funktioniert, können Sie/der Lage sein, die ersten gebrauchs Modelle auf dem ersten Lauf zu erstellen, serialisiert sie auf die Festplatte, und laden sie von da an. Bei einigen Arbeiten sollte es auch möglich sein, alle Objekte (verschiedener Typen) zu einer einzigen Sammlung hinzuzufügen und diese zu serialisieren, so dass alle Daten in einer Datei gespeichert werden können.

Also ja, das ist möglich und kann in der Tat schneller sein, obwohl nicht, wie Sie ursprünglich dachten.

+0

Was wäre, wenn der Speicher an der exakten Adresse wieder eingefügt wurde, an der er abgehoben wurde? So etwas wie Windows Ruhezustand/Wiederherstellung? Der gesamte PC ist in meiner Kontrolle. –

+0

Es ist sehr schwierig, wenn nicht unmöglich, das zu garantieren. Hibernate arbeitet auf Kernel-Ebene. Wenn Sie also den Kernel nicht dazu zwingen können, innerhalb dieses Blocks keinen Speicher zuzuweisen, laden Sie die gespeicherten Daten und ordnen Sie sie dann einer bestimmten Adresse in der virtuellen Speicherzuordnung des Prozesses zu. Dies wird nicht passieren. Das meiste oder alles ist in .Net nicht möglich, und wahrscheinlich arbeitet nicht einmal C/asm direkt mit dem WinAPI. Serialisierung ist definitiv ein korrekterer Ansatz innerhalb der .Net-Welt und kann später viele Kopfschmerzen erschweren (einfacher und sicherer). – ssube

+0

Meine Frage mit Hibernate-Idee aktualisiert. Könnte das funktionieren? –