Ich versuche, die Handhabung großer Datensätze mit mmap zu optimieren. Ein Dataset liegt im Gigabyte-Bereich. Die Idee bestand darin, die gesamte Datei in den Speicher zu kopieren, sodass mehrere Prozesse gleichzeitig an der Datenmenge arbeiten konnten (schreibgeschützt). Es funktioniert jedoch nicht wie erwartet.Linux/Perl mmap Leistung
Als einfachen Test mmap ich einfach die Datei (mit perl Sys :: Mmap-Modul, mit der "mmap" Sub, die ich glaube direkt auf die zugrunde liegende C-Funktion) und den Prozess schlafen. Der Code verbringt dabei mehr als eine Minute, bevor er vom mmap-Aufruf zurückkehrt, obwohl dieser Test nichts - nicht einmal einen Lesevorgang - aus der mmap-Datei ausführt.
Ich denke, vielleicht Linux benötigt die ganze Datei gelesen werden, wenn zuerst mmap'ed, so nachdem die Datei im ersten Prozess zugeordnet wurde (während es im Schlaf war), rief ich einen einfachen Test in einem anderen Prozess versuchte, die ersten paar Megabyte der Datei zu lesen.
Überraschenderweise scheint der zweite Prozess auch eine Menge Zeit zu benötigen, bevor er vom mmap-Aufruf zurückkehrt, etwa zur gleichen Zeit, zu der die Datei das erste Mal erstellt wird.
Ich habe sichergestellt, dass MAP_SHARED verwendet wird und dass der Prozess, der die Datei das erste Mal zugeordnet wurde, noch aktiv ist (dass es nicht beendet wurde und dass die mmap nicht zugeordnet wurde).
Ich erwartete eine mmapped Datei würde mir erlauben, mehrere Worker-Prozesse effektiven wahlfreien Zugriff auf die große Datei geben, aber wenn jeder mmap-Aufruf das Lesen der gesamten Datei zuerst erfordert, ist es ein bisschen schwieriger. Ich habe nicht mit lang andauernden Prozessen getestet, um zu sehen, ob der Zugriff nach der ersten Verzögerung schnell ist, aber ich habe erwartet, MAP_SHARED zu verwenden, und ein anderer separater Prozess wäre ausreichend.
Meine Theorie war, dass mmap mehr oder weniger sofort zurückkehren würde, und dass Linux die Blöcke mehr oder weniger auf Abruf laden würde, aber das Verhalten, das ich sehe, ist das Gegenteil, zeigt an, dass es das Lesen der gesamten Datei auf jedem erfordert Anruf nach mmap.
Irgendeine Idee, was ich falsch mache, oder wenn ich vollständig missverstanden habe, wie mmap funktionieren soll?
+1 für die Nachverfolgung mit einer detaillierten Erklärung. – RichieHindle
Verwenden Sie 3 Arg-Form von open(). –