Alle Fragen von einem PROFI an einen SUPER PROFI - 1. - Seite 27

 
sergeev:

Diese Frage betrifft die Arbeit mit Memory Mapping.

Ist es möglich, die Größe des zugewiesenen Speichers (CreateFileMapping) und seine Projektion (MapViewOfFile) dynamisch zu ändern, ohne auf das Kopieren und Neuanlegen zurückgreifen zu müssen?

Das heißt, es geht um Folgendes:

Ein CreateFileMapping-Objekt wird im Speicher erstellt, um Daten zwischen Prozessen (Writer-Reader) von 100 Byte auszutauschen. und MapViewOfFile von derselben Größe von 100 Byte.

Der erste schreibende Prozess kann alle 100 Bytes an Daten in den Speicher schreiben, die der zweite lesende Prozess nicht mehr bereinigen kann.

Die Herausforderung ist also, gibt es eine Möglichkeit, die zugewiesene Speichergröße zu erweitern, ohne CreateFileMapping / MapViewOfFile erneut zu erstellen?
So würde der erste Prozess nicht auf die Freigabe warten, sondern weiter in die hinzugefügte Größe schreiben, während der zweite Prozess ebenfalls weiter lesen würde.

Sie können. Aber es ist besser, mehr auf einmal zuzuweisen. Es wird schneller funktionieren. Ich habe es in der gleichen Bibliothek implementiert.
 
Zhunko:
Ja, das können Sie. Aber es ist besser, eine größere Menge auf einmal zuzuweisen.

Ähm, das ist eine etwas falsche Bezeichnung.

Das Mapping hat keine Größe, nur die maximale Größe wird bei der Erstellung angegeben, die normalerweise (und standardmäßig) der Größe der Datei entspricht, mit der wir arbeiten.

Die Größe der Ansicht wird bei der Erstellung festgelegt und kann ohne die Funktion UnmapViewOfFile nur im Falle von Schamanismus mit Zugriffsflags geändert werden, und vielleicht sogar überhaupt nicht.

Und warum sollte man die Größe überhaupt ändern?

 
Zhunko:
Ja, das können wir.
Wie? Schicken Sie mich nicht zu MSDN und Google, ich bin schon einen halben Tag dort.

TheXpert:

Ähm, das ist eine etwas falsche Bezeichnung.

Mapping hat überhaupt keine Größe, es wird nur eine maximale Größe bei der Erstellung angegeben, die normalerweise (und standardmäßig) der Größe der Datei entspricht, mit der Sie arbeiten.

Das ist der Punkt. Ich habe geschrieben, dass die Größe = 100 Bytes bei der Erstellung angegeben wird.
Zweitens arbeite ich nicht mit einer physischen Datei, sondern nur mit Speicher. ein Prozess gibt die Informationen an einen anderen Prozess weiter.

Und warum sollte man die Größe überhaupt ändern?

Während des Betriebs wird der zugewiesene Speicher auf die vollen 100 Bytes aufgefüllt. Aber es tauchen neue Daten auf, und wir müssen sie folglich hinzufügen. Wir müssen also diese Größe erweitern, um sie hinzuzufügen.

Deshalb frage ich, wie ich die 100 Bytes, die ich zugewiesen habe, erweitern kann, ohne sie zwischendurch zu kopieren und neu zu erstellen.

Ich habe es mit der Ansicht. Ich muss sie nur neu erstellen. Aber was ist mit dem CreateFileMapping-Objekt selbst? Kann es erweitert werden, ohne es zu schließen?

 
Offenbar ist die Mapping-Größe in Create auf eine feste Größe eingestellt.
.
Sie können wahrscheinlich nur neu erstellen.
.
ABER: Wenn Sie eine Sparse-Datei von enormer Größe (z. B. 2 Gigabyte) erstellen, ist
in Ordnung. Das Ende der Datei muss jedoch außerhalb der Systemdateigröße verstanden werden.
.
Aber dann müsste man schon fragen, wie man den Prozess des Lesens aus der Datei
synchronisiert, d.h. wie man weiß, welcher Teil der Daten wohin geschrieben wird.
 

Im Großen und Ganzen besteht kein Bedarf an einem solchen Band.

Prozesse schreiben/lesen einfach asynchron. Und wir brauchen eine Möglichkeit, dass der Schreiber nicht unglücklich ist, während der Leser darauf wartet, dass alle Daten geschrieben werden.

Das heißt, Sie brauchen so etwas wie ArrayResize, um das Array zu erweitern, ohne seinen Inhalt zu verändern. Sobald der Leser alle Daten erfasst hat, ist der gesamte Speicher wieder von Anfang an zum Schreiben verfügbar.

 
jartmailru:

Aber dann stellt sich die Frage, wie man den Lesevorgang aus der Datei synchronisieren kann -
d.h. wie man weiß, welcher Teil der Daten wohin geschrieben wurde.

Ich habe dieses Problem sofort gelöst.

aber noch nicht mit dynamischer Größenanpassung :(

Wenn Vadim (Zhunko) so großzügig ist, wird er mir hoffentlich sagen, welche Funktionen ich verwenden soll...
 
Ich wiederhole: Es gibt so etwas wie Sparse-Dateien...
Das bedeutet, dass eine 2-Gigabyte-Datei 0 Bytes auf der Festplatte belegt.

Hmm. Kann man die Datei nicht auf die maximale Größe einstellen
der zu übertragenden Daten?
 
jartmailru:
Ich wiederhole: Es gibt so etwas wie Sparse-Dateien...
Das bedeutet, dass eine 2-Gigabyte-Datei 0 Bytes auf der Festplatte benötigt.

Ich verwende keine Dateien, alles läuft über den Speicher, das habe ich oben schon dreimal geschrieben.

// wenn es einfacher ist

CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, FILE_SIZE, "Local\page");

Ich habe Probleme mit dieser FILE_SIZE.

Hmm. Und Sie können die Datei nicht auf die maximale Größe der zu übertragenden Daten einstellen?
die Menge der Daten ist nicht im Voraus bekannt.
Ich lese gerade über Sparse, vielleicht sind sie nützlich, wenn sie dynamisch erweitert werden können.
 
sergeev:

Genau das ist der Punkt: Ich habe Ihnen gesagt, dass die Größe auf 100 Byte festgelegt wurde.

Zweitens arbeite ich nicht mit einer physischen Datei, sondern nur mit Speicher. Ein Prozess gibt Informationen an einen anderen Prozess weiter.

Was ist der Unterschied? Das Prinzip ist dasselbe, nur dass die Informationen in den Speicher und nicht auf die Festplatte geschrieben werden. Trotzdem arbeiten wir mit einem Handle, das über CreateFile geöffnet wurde.

Dort (bei der Erstellung einer Datei im Speicher) ist es notwendig, die maximal mögliche Größe anzugeben, über die hinaus genau keine Informationen vorhanden sein werden.

Während Sie arbeiten, füllt sich der zugewiesene Speicher bis zu den vollen 100 Bytes.

Und wo liegt das Problem? Ich habe eine weitere Ansicht mit einem 100-Byte-Offset erstellt, aber die Mapping-Größe (d.h. die Dateigröße) sollte dies von vornherein einbeziehen.

Ich habe es mit der Aussicht. Aber was ist mit dem CreateFileMapping-Objekt selbst? Kann es erweitert werden, ohne es zu schließen?

Eine Ausweitung ist falsch, die Größe sollte dies bereits berücksichtigen.
 
TheXpert:
Die Ausweitung ist falsch, denn die Größe sollte dies bereits berücksichtigen.
Es scheint die einzige Möglichkeit zu sein.