2010-02-03 6 views
6

Meine Umgebung ist XP 32-Bit. Ich finde, wenn zugeteilter Speicher ist fast die maximale Größe, 2 GB, das bedeutet ein wenig virtuellen Raum ist verfügbar, Zuteilung neuer Speicher ist sehr langsam.Welches ist schneller, Lesen von Festplatte oder Zuweisung von Systemspeicher

Also wenn ich eine Auslagerungsdatei habe, muss meine App sie analysieren. Ich habe zwei Möglichkeiten. Eins ist, sie alle in Systemspeicher zu lesen, dann die Analyse zu machen. Die andere besteht darin, einen Speicherpuffer zuerst als Cache zu reservieren und einen Teil der Auslagerungsdatei in diesen Puffer einzulesen, zu analysieren und dann zu verwerfen, dann den zweiten Teil der Auslagerungsdatei zu lesen und den Cache zu überschreiben, die Analyse erneut durchzuführen.

Aus der Profilerstellung sieht es aus, als ob die zweite schneller ist, da sie die Zeit für die Zuteilung vermeidet.

Was denkst du? Danke im voraus.

+1

+1 für Profiling! – Justin

Antwort

5

(1) Ich bin mir nicht sicher, ob die Frage mit dem Titel übereinstimmt. Wenn Sie unter 32-Bit-Windows knapp 2 GB RAM zuweisen, wird wahrscheinlich viel Speicher auf die Festplatte ausgelagert, und hier würde ich zuerst nach der Verlangsamung suchen. Wenn Sie viel Arbeitsspeicher verwenden, sollten Sie es als gespeichert auf Datenträger (in Auslagerungsdatei.sys), aber zwischengespeichert im physischen RAM. Der zweite könnte schneller sein, nicht wegen der Kosten für die Zuweisung, sondern wegen der Kosten für die gleichzeitige Verwendung einer großen Menge an Speicher. In der Tat, wenn Sie die Datei in eine große Zuweisung kopieren, kopieren Sie viel von Festplatte-> Festplatte über RAM, und wenn Sie sie erneut zum Analysieren durchlaufen, laden Sie die Kopie wieder in den Arbeitsspeicher. Wenn es sich bei Ihrer Analyse um einen Single-Pass-Algorithmus handelt, der viel redundante Arbeit erfordert.

(2) Was ich denke ist, mmap die Datei (MapViewOfFile und Freunde unter Windows).

Edit: (3) eine Warnung. Wenn die Datei derzeit 1,8 GB groß ist, könnte es im nächsten Jahr eine Wahrscheinlichkeit von 4 GB geben. Wenn ja, würde ich jetzt planen, dass es eine Größe größer als 2^32 auf einer 32-Bit-Maschine hat, was bedeutet, entweder Ihre zweite Option zu nehmen, oder noch MapViewOfFile zu verwenden, aber einen vernünftigen Teil der Datei zu machen Zeit, anstatt alle auf einmal. Andernfalls werden Sie diesen Code erneut aufrufen, wenn jemand das erste Mal an einer großen Datei versucht und den Fehler meldet.

+0

Danke. Es ist interessant. Aber ich habe 4GB RAM. Vom Task-Manager ist der verfügbare physische Arbeitsspeicher 1,6 GB frei. Bedeutet dies immer noch, dass viele Puffer in der sys-Auslagerungsdatei gespeichert werden, wenn die Zuweisung knapp 2 GB beträgt? – Buzz

+0

Die Pufferzuweisung kann früh genug fehlschlagen, bevor der RAM-Speicher erschöpft ist. Die Frage ist, ob Sie ein 64-Bit-Windows ausführen. Dadurch können Sie> 2 GB RAM pro Prozess verwenden. – MSalters

+1

@MSalters: Der Fragesteller läuft 64-Bit Windows nicht. @Buzz: Man könnte meinen, dass Windows Swap (für Nicht-Idle-Programme) nicht drücken würde, bevor der gesamte RAM verwendet wird, aber es scheint nie so zu funktionieren. Es ist möglich, dass in Ihrem Fall kein Swapping stattfindet, aber wenn ich versuchen würde, den Leistungsunterschied zwischen Ihren beiden Optionen vollständig zu erklären, würde ich es ausschließen wollen - als einfachsten Test, stellen Sie sicher, dass die Seitendatei nicht erhöht wird Programm läuft. Als nächstes sollten CPU-Cache-Misses betrachtet werden. Aber wie gesagt, ich würde die Datei abbilden, und wenn das der Schnellste ist, der sich um die anderen kümmert? ;-) –

5

Sie 3D Art und Weise vergessen - Speicher auf Datei auf der Karte, siehe Funktion Create/MapViewOfFile Dies ist besonders schnelle Art und Weise

+0

Es ist anders herum. Die Datei wird dem Prozessadressraum zugeordnet. – Void

0

Warum ist die Menge Speicher so hoch zugeordnet? Wenn die Speicherzuweisung eine angemessene Zeit in Anspruch nimmt, ist es viel schneller, dies im Speicher zu tun. Ich würde es im Speicher machen und versuchen, die Speicherbelegung so zu reduzieren, dass sie wieder schnell geht .

1

Am besten verwenden Sie die Windows MapViewOfFile und ähnliche Funktionen (das Windows-Äquivalent von mmap). Dies ermöglicht dem Betriebssystem, das Paging von verschiedenen Teilen der Datei zu verwalten.

+0

Aber wenn ich mehrere große Seitendateien (1.8GB) habe, ist das OK? – Buzz

+0

Das Betriebssystem wird die gesamte Datei in den Speicher Ihres Prozesses abbilden, lädt aber nur die Teile der Datei, die Sie gerade betrachten.Dies ist genau die Art und Weise, wie das Betriebssystem seinen Plattenauslagerungsbereich verwaltet. – doron

+2

@Buzz: Sie können nicht alle 1,8 GB-Dateien gleichzeitig in demselben 32-Bit-Prozess abbilden, da der virtuelle Speicherplatz zugewiesen werden muss, obwohl der physische Speicher nur bei Bedarf festgeschrieben wird. Verschiedene Dateien in verschiedenen Prozessen sollten, soweit ich weiß, in Ordnung sein, und Sie können die Datei immer in Chunks abbilden (genauso wie Ihre zweite Option Chunks liest, aber größere Chunks abbildet). –

0

Wie ich die Situation sehe, verwalten Sie entweder das Paging selbst oder lassen das Betriebssystem den Paging für Sie verwalten. In den meisten Fällen würde ich vorschlagen, dass das Betriebssystem das Paging übernimmt (benutze virtuellen Speicher). Da ich MS-Betriebssysteme misstraue, kann ich diese Technik nicht empfehlen, obwohl die Laufleistung variieren kann.

Verwandte Themen