Python, Ctypes und mmap

8

Ich frage mich, ob es für das ctypes-Paket möglich ist, mit mmap zu interagieren.

Momentan reserviert mein Modul einen Puffer (mit create_string_buffer ) und übergibt diesen dann mit byref an meine Bibliotheken mylib.read -Funktion. Dies, wie der Name schon sagt, liest Daten in den Puffer. Ich rufe dann file.write(buf.raw) auf, um die Daten auf die Festplatte zu schreiben. Meine Benchmarks zeigen jedoch, dass dies alles andere als optimal ist (die Zeit in file.write ist besser in mylib.read verbracht).

Ich bin daher daran interessiert zu wissen, ob ctypes mit mmap zusammenarbeiten können. Bei einer mmap.mmap Instanz und einem Offset wie bekomme ich einen Zeiger ( c_void_p ) in den Adressraum?

    
Freddie Witherden 03.09.2010, 22:51
quelle

2 Antworten

10

Ein mmap -Objekt "unterstützt die schreibbare Pufferschnittstelle", daher können Sie den from_buffer verwenden class-Methode, die alle ctypes -Klassen haben, mit der mmap -Instanz als Argument, um ein ctypes -Objekt genau so zu erstellen, wie du willst, dh den Speicher (und damit die zugrunde liegende Datei) zu teilen Die mmap Instanz ist zugeordnet. Ich stelle mir insbesondere vor, dass Sie ein geeignetes ctypes Array möchten.

    
Alex Martelli 04.09.2010, 02:11
quelle
1

Beachten Sie, dass das Betriebssystem sowieso Readahead für read () ausführt. Sie werden entweder in read () oder write () blockieren - der eine oder andere wird die Operation zu einem Flaschenhals machen - aber obwohl Sie in einem blockieren, bedeutet das nicht, dass der andere nicht stattfindet für Sie hinter den Kulissen. Das ist die Aufgabe jedes Multitasking-Betriebssystems.

Wenn Sie mmap dafür verwenden, machen Sie die Sache für das Betriebssystem sehr wahrscheinlich komplizierter - dadurch wird es schwieriger für Sie festzustellen, dass Sie Daten einfach rein- und rausspeichern und es dadurch komplizierter machen Vorlesen. Es kann es immer noch herausfinden (Betriebssysteme sind sehr gut darin), aber Sie helfen wahrscheinlich nicht.

Der einzige Vorteil besteht im Prinzip darin, die Kosten für eine Speicherkopie zu vermeiden, aber das klingt hier nicht nach Ihrem Ziel (und wenn Profiling nicht eindeutig etwas anderes sagt, würde ich stark daran zweifeln, dass dies der Performance helfen würde).

>     
Glenn Maynard 04.09.2010 02:10
quelle

Tags und Links