2012-05-14 5 views
5

Ich verstehe, wie Speicherabbilddateien in C# funktionieren, da jede Anforderung von Daten zu einer Kopie führt. Wenn Sie beispielsweise eine große Datenstruktur als Datei beibehalten, führt die Verwendung einer Speicherabbilddatei zu Speicher für die tatsächliche Datei, die dem RAM zugeordnet ist, und einer Kopie, die sich in einem GC-Heapspeicher befindet, nachdem sie aus der Datei gelesen wurde.Ist es möglich, Kopien von Daten zu vermeiden, wenn Speicherabbilddateien in C# verwendet werden?

Ich gehe davon aus, dass Zeiger und GC im Allgemeinen nicht gut miteinander auskommen.

Also, gibt es einen Weg um diese?

  • Vielleicht über einen gemischten C++ -Modus, der eine verwaltete API über die im Speicher abgebildeten Daten verfügbar machen kann?
  • Was ist mit direkter Zeigermanipulation mit unsicheren C#?
  • Das allgemeine Problem, das ich versuche zu lösen, ist die gemeinsame Nutzung einer großen Datenstruktur zwischen mehreren Prozessen. Die Datenstruktur wird verwendet, um eine kleine Menge von "Fragen" zu beantworten, die als eine einfache API offengelegt werden können (d. H. Im Grunde genommen ein hochspezialisierter Index einer Menge anderer Daten).

    Nebenbei macht dies die .NET API für das Szenario "große Datenmengen freigeben" nicht nutzlos?

    +1

    http://code.msdn.microsoft.com/windowsdesktop/Inter-process-communication-e96e94e7 –

    +0

    Lesen Sie die gesamte Datei auf einmal in die .NET-Anwendung? Wenn Sie Teile der Speicherabbilddatei nach Bedarf lesen, reservieren Sie eine Menge kleiner Puffer, aber das ist nicht so teuer, wie Sie vielleicht denken. Es mag möglich sein, Kopien zu vermeiden, aber ist der Aufwand, Kopien zu erstellen, wirklich ein Problem? –

    +0

    Ich habe .NET-Anwendungen, die sehr effektiv "große Datenmengen" auf verschiedene Arten "teilen", einschließlich Speicherabbilddateien. Insbesondere teilt sich eine Suite mehr als 8 Gigabyte, und die Gesamtspeicherauslastung dieser Programme liegt überraschend nahe bei 8 Gigabyte. –

    Antwort

    4

    Sie können unsicheren Code verwenden, um direkt auf den zugeordneten Speicher zuzugreifen. Ich schlage vor, Sie schauen in "blitable Strukturen", die Strukturtypen sind, die im Speicher ohne Modifikation kopiert werden können. Hier ist ein Beispiel:

    struct MyDataRecord { public int X, Y; } 
    
    ... 
    
    for (var i = 0 .. 10) { 
    ((MyDataRecord*)pointerToUnmanagedMemory)[i] = new MyDataRecord() { X = i, Y = i * i }; 
    } 
    

    Dies ist sehr performant und eine Art bequem.

    +0

    Hmm, Sie haben den benannten Mutex übersprungen, um sicherzustellen, dass ein Prozess keine Daten liest, die gerade geschrieben werden. Das hat ein Talent dafür, "bequem" aus dem Fenster zu werfen. Und töten perf. –

    +0

    Sieht aus wie unsichere Code und blitable Strukturen wird der Weg sein zu gehen ... Danke @ usr. Ich fand das auch nach dem Einfügen von "unsicher" in meine Suche: http://stackoverflow.com/questions/7956167/how-can-i-quickly-read-bytes-from-a-memory-map-file-in-net – David

    Verwandte Themen