Frage

Wenn Memory-Mapped-Dateien mit es scheint, es ist entweder schreibgeschützt oder schreib nur. Damit meine ich, kann man nicht:

      
  • hat eine zum Schreiben geöffnet und später entscheiden, es nicht zu retten   
  • haben offen offen für das Lesen, und später entscheiden, es zu retten

Unsere Anwendung verwendet eine beschreibbare Speicherbild-Datei Datendateien zu speichern, aber da der Benutzer ohne Speichern der Änderungen verlassen möchten, müssen wir eine temporäre Datei verwenden, die der Benutzer tatsächlich bearbeitet. Wenn der Benutzer die Änderungen zu speichern entscheidet, wird die Originaldatei mit der temporären Datei überschrieben, so dass es die neuesten Änderungen hat. Dies ist umständlich, da die Dateien sehr groß sein können (> 1 GB) und es dauert eine lange Zeit, um sie zu kopieren.

Ich habe versucht, viele Kombinationen der Flags verwendet, um die Dateizuordnung zu erstellen, aber keine scheinen die Flexibilität des Sparens bei Bedarf zu ermöglichen. Kann jemand bestätigen dies der Fall ist? Unsere Anwendung ist in Delphi geschrieben, aber es nutzt den Standard-Windows-API die Zuordnung, in unserem Fall

erstellen
FMapHandle := CreateFileMapping(FFileHandle, nil, PAGE_READWRITE, 0, 2 * 65536, nil);
FBasePointer := MapViewOfFile(FileMapHandle, FILE_MAP_WRITE, FileOffsetHigh,
FileOffsetLow, NumBytes);
War es hilfreich?

Lösung

Ich glaube nicht, Sie können. Damit meine ich Sie können der Lage sein, aber es macht keinen Sinn für mich: -)

Der ganze Sinn eines Memory-Mapped-Datei ist, dass es ein Fenster auf die aktuelle Datei ist. Wenn Sie keine Änderungen wany in der Datei reflektiert, werden Sie wahrscheinlich so etwas wie Batch auf die Änderungen in einer Datenstruktur zu tun haben (zB eine Anordnung von Basisadresse, Größe und Daten) und sie gelten beim Speichern.

In diesem Fall würde man eigentlich nicht Notwendigkeit die Memory-Mapped-Datei, lesen Sie einfach in und hält die Stücke Sie ändern möchten (sperren die Datei zuerst, wenn es eine Chance von Multi-User-Zugriff ).

Update:

Haben Sie sich Gedanken über die Möglichkeit, dabei eine speichern, die Originaldatei zu löschen und nur die temporäre Datei auf den ursprünglichen Dateinamen umbenennen? Das ist wahrscheinlich, viel schneller sein als das Kopieren 1G von Daten aus nur vorübergehend Original. Auf diese Weise, wenn Sie nicht wollen, es gespeichert hat, nur die temporäre Datei löschen und das Original halten.

Sie werden immer noch die ursprünglichen Daten in die temporäre Datei zu kopieren, wenn das Laden, aber Sie werden die temporären Daten wieder nicht kopieren müssen (ob Sie es oder nicht speichern.) -, dass die Zeit genommen, halbieren würde

Andere Tipps

Möglich, aber nicht trivial.

Sie haben in den Speicher gemappt Grundlagen, und die Differenz zwischen den drei Modi der Memory-Mapped-Dateien zu verstehen. Sowohl einen Teil Ihres virtuellen Adressraumes beiseite legen und einen Mapping-Eintrag in einer internen Tabelle erstellen. Keine physische RAM wird zunächst zugeordnet. Daher wird, wenn Sie den Speicher zuzugreifen versuchen, die CPU-Fehler und das Betriebssystem haben zu reparieren. Er tut dies, indem Sie die Dateiinhalte Kopieren des RAM auf Ihren Prozess RAM und Kartierung, an der Verwerfungen Adresse.

Nun wird der Unterschied zwischen den drei Modi ist wie die Deskriptoren auf den abgebildeten Seiten festgelegt werden. In allen Fällen Sie den Zugriff auf den Seiten erhalten lesen. (Der erste Modus). Wenn Sie für den Schreibzugriff jedoch stellen und anschließend es, auf Ihrem ersten Schreib schreiben die Seite als beschreibbar und schmutzig markiert. Es kann dann wieder in die ursprüngliche Datei geschrieben werden, im Ermessen des OS (zweiter Modus). Schließlich ist es möglich, Copy-on-Write-Semantik zu erhalten. Sie beginnen immer noch mit nur Lesezugriff auf die Seite im Speicher aus. Wenn Sie es schreiben, muss die CPU noch Fehler und das Betriebssystem, es zu reparieren. Mit copy-on-write, wird diese Korrektur durch Einstellen der Hintergrundspeicher der geändertenen Seite in die Auslagerungsdatei getan, statt der ursprünglichen Abbilddatei.

Also, in Ihrem Fall, dass Sie Copy-on-Write-Modus verwenden. Wenn der Benutzer entscheidet, die Änderungen zu verwerfen, kein Problem. Sie verwerfen einfach die Speicherzuordnung. Alle Seiten, die im Speicher geändert wurden, und wurden von der Seite Datei gesichert werden ebenfalls verworfen.

Wenn der Benutzer zu speichern entscheidet, haben Sie eine etwas schwierigere Aufgabe bekommen. Sie müssen nun, um herauszufinden, welche Teile der Datei geändert haben. Diese Änderungen sind im Speicher, und Sie müssen diese auf die Quelldatei erneut anwenden. Sie können dies tun mit Seite Guards . Also, wenn der Benutzer entscheidet, zu speichern, kopieren Sie alle geänderten Seiten auf einem separaten Speicherblock, neu zuordnen, die (unveränderte) Datei zum Schreiben, und wenden Sie die Änderungen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top