2017-04-04 14 views
-1

Edit: Wenn Sie downvote, erklären Sie bitte warum. Hilft niemandem.Wie wird MemoryMappedViewAccessor richtig verwendet?

Ich versuche wirklich zu verstehen, wie man im Speicher abgebildete Dateien richtig verwendet, aber ich habe einige Probleme. Hier ist das Szenario:

Ich habe einige große Dateien, irgendwo von 1-10 GB. Diese bestehen aus structs, alle 128 Bytes außer dem allerersten der Datei.

Ich brauche einen zufälligen Zugriff auf eine dieser Strukturen schnell, was von was ich lese ist, was eine Memory-Mapped-Datei ist perfekt für. Ich brauche diese Speicherkarten auch, um von anderen Prozessen geöffnet werden zu können, aber es wird nichts geschrieben, nur das Lesen der Datei.

Ich bin in der Lage, den Byte-Offset der genauen Struktur zu bestimmen, die ich lesen muss.

Zuerst versuchte ich, wie so die mem-Mapped-Datei zu machen:

MemoryMappedFile hFileMapping = MemoryMappedFile.CreateFromFile(rampPath, FMode, Path.GetFileNameWithoutExtension(rampPath), GetFileLength(rampPath), access); 

jedoch andere Prozesse nicht öffnen können. So fand ich, dass es einen anderen Konstruktor gab, der ein nahm. So habe ich es so aus:

FileStream fs = new FileStream(rampPath, FileMode.OpenOrCreate, FileAccess.Read, FileShare.Read); 
MemoryMappedFile hFileMapping = MemoryMappedFile.CreateFromFile(fs, Path.GetFileNameWithoutExtension(rampPath), GetFileLength(rampPath), access, null, HandleInheritability.Inheritable, true); 

Andere Verfahren könnten die mem-Mapped-Datei öffnen jetzt. Versuche Sie dann mache ich einen Blick auf die abgebildete Datei:

MemoryMappedViewAccessor hFileAccessor = hFileMapping.CreateViewAccessor(0, GetFileLength(rampPath), MemoryMappedFileAccess.Read)); 

Das ist in Ordnung, wenn die Dateien klein sind, aber wenn sie groß sind, ich out of storage und Speicher Ausnahmen.

Also muss ich nur einen Teil der Datei auf einmal zuordnen, aber was ist der beste Weg zu bestimmen, ob die Struktur, die ich suche, in der aktuell gemappten Ansicht ist? Behalte ich den Offset und die Länge der aktuell gemappten Ansicht im Auge und sehe, ob der Offset der Struktur dort ist? Gibt es einen besseren Weg, all dies zu tun?

+1

Wenn Ihre primäre ID sequenziell ist, können Sie eine Berechnung basierend auf der bekannten Größe und dem Offset verwenden. Wenn die Seite im Speicher ist, dann großartig, wenn nicht, dann haben Sie eine klare Anzahl von Offsets, die Sie lesen müssen, um dorthin zu gelangen, wo Sie denken, dass Ihre Aufzeichnung von Interesse sein könnte. Wenn Sie keine sequentielle Zugriffsmethode verwenden können, müssen Sie Ihre Partitionen von Anfang bis Ende lesen. Sie können jedoch Techniken zur Effizienzsteigerung einbauen, wie zum Beispiel die Zwischenspeicherung Ihrer Bezeichner und den Partitionsoffset beim Lesen der Strukturen und anderer Indizes. esque Zeug. –

+1

Datensatz für Datensatzlesevorgänge mit dem ViewAccessor funktionieren möglicherweise für Sie, größere Hops können sich jedoch je nach Auslastung als effizienter erweisen. –

+0

Danke! Was meinst du mit "Primärkennung ist sequenziell"? – pfinferno

Antwort

0

Dank @Ross Bush in den Kommentaren des OP für die Vorschläge.

Was ich getan habe, war nur die ViewAccessor 's Kapazität einen festgelegten Betrag immer zu machen. Und da ich den Byte-Offset habe, den ich brauche, habe ich nur ein paar Berechnungen durchgeführt, um festzustellen, ob der Byte-Offset innerhalb der ViewAccessor liegt oder nicht. Wenn dies nicht der Fall ist, ändern Sie den Wert ViewAccessor in einen anderen Offset/Kapazität, so dass der Byte-Offset in diesen Bereich fällt.

Verwandte Themen