2016-09-06 5 views
1

Momentan arbeite ich mit einem NumPy memmap Array mit 2.000.000 * 33 * 33 * 4 (N * W * H * C) Daten. Mein Programm liest zufällige (N) Indizes von diesem Array.Numpy memmap Bessere IO- und Speichernutzung

Ich habe 8 GB RAM, 2 TB HDD. Die HDD-Lese-IO beträgt nur etwa 20 M/s, die RAM-Nutzung bleibt bei 2,5 GB. Es scheint, dass es einen HDD-Engpass gibt, weil ich Zufallsindizes abrufe, die offensichtlich nicht im Memmap-Cache sind. Daher möchte ich, dass der Memmap-Cache so viel RAM wie möglich verwendet.

Gibt es eine Möglichkeit für mich, memmap zu informieren, um die IO- und RAM-Nutzung zu maximieren?

Antwort

2

(Überprüfen meiner Python 2.7-Quelle) Soweit ich kann sagen, NumPy Memmap verwendet mmap. Mmap tut definieren:

# Variables with simple values 
... 
ALLOCATIONGRANULARITY = 65536 
PAGESIZE = 4096 

aber ich bin nicht sicher, wäre es klug (oder sogar möglich) sein, diese zu ändern. Darüber hinaus löst dies möglicherweise nicht Ihr Problem und würde Ihnen auf keinen Fall die effizienteste Lösung bieten, da Caching und Seitenlesen auf Betriebssystem- und Hardwareebene erfolgt (weil für die Hardware mehr oder weniger die gleiche Zeit zum Lesen eines einzelnen benötigt wird) Wert oder die ganze Seite).

Eine viel bessere Lösung wäre wahrscheinlich, Ihre Anfragen zu sortieren. (Ich nehme hier an, dass N groß ist, sonst sortiere sie einfach einmal): Sammle eine Menge von ihnen (sagen wir ein oder zehn Millionen?) Und sortiere sie, bevor du die Anfrage machst. Dann fragen Sie die bestellten Fragen. Dann, nachdem Sie die Antworten erhalten haben, legen Sie sie wieder in ihre ursprüngliche Reihenfolge ...