Frage

Ich habe eine Anwendung, die Datenblöcke über das Netzwerk empfängt und diese auf die Festplatte schreibt.Sobald alle Chunks empfangen wurden, können sie dekodiert/rekombiniert werden, um die einzelne Datei zu bilden, die sie tatsächlich darstellen.

Ich frage mich, ob es sinnvoll ist, speicherzugeordnete Dateien zu verwenden oder nicht – erstens zum Schreiben der einzelnen Blöcke auf die Festplatte, zweitens für die einzelne Datei, in die sie alle dekodiert werden.

Meiner Meinung nach könnte es nur für den zweiten Fall nützlich sein. Hat jemand eine Idee dazu?

Bearbeiten:Es ist eine C#-App und ich plane nur eine x64-Version.(Es sollte also nicht relevant sein, auf das Problem des „größten zusammenhängenden freien Speicherplatzes“ zu stoßen.)

War es hilfreich?

Lösung

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

In diesem Szenario kann das Betriebssystem dazu beitragen, die allgemeine Speichernutzung und das Paging-Verhalten der Anwendung zu optimieren, indem es nur die zuletzt verwendeten Teile der zugeordneten Datei ein- und auslagert.

Darüber hinaus können speicherzugeordnete Dateien interessante Funktionen wie Copy-on-Write bereitstellen oder als Grundlage für Shared-Memory dienen.

Für Ihr Szenario können speicherzugeordnete Dateien Ihnen beim Zusammenstellen der Datei helfen, wenn die Blöcke nicht in der richtigen Reihenfolge eintreffen.Allerdings müssen Sie die endgültige Dateigröße immer noch im Voraus kennen.

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

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

Andere Tipps

Speicherzuordnungsdateien werden hauptsächlich zur prozessübergreifenden Kommunikation oder zur Verbesserung der E/A-Leistung verwendet.

Versuchen Sie in Ihrem Fall, eine bessere I/O-Leistung zu erzielen?

Ich hasse es, auf das Offensichtliche hinzuweisen, aber Wikipedia gibt einen guten Überblick über die Situation ...http://en.wikipedia.org/wiki/Memory-mapped_file

Speziell...

Der Speicherzuordnungsansatz hat seinen Preis in Form kleinerer Seitenfehler – wenn ein Datenblock in den Seitencache geladen, aber noch nicht dem virtuellen Speicherraum des Prozesses zugeordnet wird.Abhängig von den Umständen kann die speicherzugeordnete Datei-E/A tatsächlich wesentlich langsamer sein als die Standard-Datei-E/A.

Es hört sich so an, als ob Sie im Begriff sind, die Geschwindigkeit vorzeitig zu optimieren.Warum nicht einen regulären Dateiansatz und später bei Bedarf eine Umgestaltung für MM-Dateien?

Ich würde sagen, beide Fälle sind relevant.Schreiben Sie einfach die einzelnen Blöcke an die richtige Stelle in der Speicherzuordnungsdatei, und zwar in der falschen Reihenfolge, sobald sie eingehen.Dies ist natürlich nur dann nützlich, wenn Sie wissen, wohin jeder Block gehen soll, wie bei einem BitTorrent-Downloader.Wenn Sie eine zusätzliche Analyse durchführen müssen, um zu wissen, wo der Block abgelegt werden soll, ist der Vorteil einer speicherzugeordneten Datei möglicherweise nicht so groß.

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