2009-12-07 18 views
40

Ich habe eine Anwendung, die Datenpakete über das Netzwerk empfängt und diese auf die Festplatte schreibt. Sobald alle Chunks empfangen wurden, können sie in die einzelne Datei decodiert/rekombiniert werden, die sie tatsächlich repräsentieren.Wann sollten Speicherkarten verwendet werden?

Ich frage mich, ob es nützlich ist, Speicher-Mapped-Dateien zu verwenden oder nicht - zuerst für das Schreiben der einzelnen Chunks auf die Festplatte, zweitens für die einzelne Datei, in die sie alle dekodiert werden.

Mein eigenes Gefühl ist, dass es nur für den zweiten Fall nützlich sein könnte, hat jemand einige Ideen dazu?

Bearbeiten: Es ist eine C# -App, und ich plane nur eine x64-Version. (Daher sollte das Problem mit dem größten verfügbaren Speicherplatz nicht relevant sein)

+0

Guten Ruf, ich habe meine Post bearbeitet, um zu erarbeiten - Es wird eine x64-only-App sein. – Pygmy

+1

Welchen Vorteil (en) haben Sie mit einer MM-Datei? –

+0

Ist die Geschwindigkeit normalerweise nicht der Hauptvorteil von MMAP-Dateien? –

Antwort

25

Speicherabgebildete Dateien sind nützlich für Szenarien, in denen auf einen relativ kleinen Teil (Ansicht) einer erheblich größeren Datei wiederholt zugegriffen werden muss.

In diesem Szenario kann das Betriebssystem dazu beitragen, die Gesamtspeicherauslastung und das Pagingverhalten der Anwendung zu optimieren, indem nur die zuletzt verwendeten Teile der zugeordneten Datei ein- und ausgeblendet werden.

Darüber hinaus können Speicher-Mapped-Dateien interessante Features wie Copy-on-Write verfügbar machen oder als Basis für Shared-Memory dienen.

In Ihrem Szenario können Speicherabbilddateien Ihnen beim Zusammenstellen der Datei helfen, wenn die Blöcke außerhalb der Reihenfolge ankommen. Sie müssen jedoch die endgültige Dateigröße im Voraus kennen.

Außerdem sollten Sie nur einmal auf die Dateien zugreifen, um einen Chunk zu schreiben. Daher ist ein Leistungsvorteil gegenüber explizit implementierten asynchronen E/A unwahrscheinlich, aber es kann einfacher und schneller sein, Ihren Dateischreiber korrekt zu implementieren.

In.NET 4, Microsoft hat Unterstützung für Speicher-Mapped-Dateien hinzugefügt, und es gibt einige umfassende Artikel mit Beispielcode, z. http://blogs.msdn.com/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files-in-net-4.aspx.

+4

Ich stimme nicht zu, dass mmf nur für kleine Ansichten sind. Auf 64-Bit-Systemen können Sie problemlos die gesamte Datei anzeigen. Das Neupositionieren einer Ansicht ist eine teure IO-Operation. –

+2

Sie haben Recht. Sie können für beliebig große oder ganze Dateiansichten verwendet werden, insbesondere für 64-Bit-Adressraum. Aber gerade dort glänzen sie nicht, wenn die Datei nur einmal gelesen oder geschrieben wird. Mein Punkt ist, in solchen Fällen async I/O wird so effizient sein, aber es ist schwieriger, richtig zu implementieren. – user33675

3

Ich würde sagen, beide Fälle sind relevant. Schreiben Sie einfach die einzelnen Chunks an ihre richtige Stelle in der Memory-Mappedatei, in der Reihenfolge, in der sie eingehen. Dies ist natürlich nur nützlich, wenn Sie wissen, wo jeder Chunk hingehen soll, wie in einem Bittorrent-Downloader. Wenn Sie eine zusätzliche Analyse durchführen müssen, um zu wissen, wo der Chunk hingehen soll, ist der Vorteil einer speicherabgebildeten Datei möglicherweise nicht so groß.

12

Speicherabgebildete Dateien werden hauptsächlich für die Kommunikation zwischen Prozessen oder die I/O-Leistung verwendet.

In Ihrem Fall versuchen Sie, eine bessere I/O-Leistung zu erzielen?

Hate the obivious darauf hin, aber Wikipedia gibt einen guten Überblick über die Situation ... http://en.wikipedia.org/wiki/Memory-mapped_file

Speziell ...

Der Speicher gemappt Ansatz seine Kosten in kleinere Seitenfehler hat - Wenn ein Datenblock in den Seitencache geladen wird, aber noch nicht in den virtuellen Speicherbereich des Prozesses eingezeichnet ist. Abhängig von den Umständen kann die Speicherabbild-Datei-E/A tatsächlich wesentlich langsamer als Standard-Datei-E/A sein.

Es klingt, als ob Sie für die Geschwindigkeit vorzeitig zu optimieren sind. Warum nicht eine normale Datei angehen und dann für MM-Dateien später bei Bedarf umgestalten?

+2

Ich bin für eine bessere IO-Leistung. Ich bekomme jetzt ungefähr 12MB/Sek. Daten (aber in Zukunft wird das viel mehr sein) und muss in der Lage sein, es so schnell wie möglich zu verarbeiten/zurückschreiben zu können. Ich habe den Wikipedia-Artikel gelesen, und ich verstehe die Vorteile beim Lesen, aber die beste Verwendung und Vorteile beim * Schreiben * in Dateien ist mir nicht genau klar, weshalb ich um Hilfe bitten, es zu verstehen:) – Pygmy

Verwandte Themen