Python, ctypes и mmap - PullRequest
       29

Python, ctypes и mmap

10 голосов
/ 04 сентября 2010

Мне интересно, возможно ли, чтобы пакет ctypes взаимодействовал с mmap.

В настоящее время мой модуль выделяет буфер (с create_string_buffer), а затем передает его, используя byref, в мою библиотеку mylib.read. Это, как следует из названия, считывает данные в буфер. Затем я вызываю file.write(buf.raw), чтобы записать данные на диск. Однако мои тесты показывают, что это далеко не оптимально (время, потраченное на file.write, лучше проводить на mylib.read).

Поэтому мне интересно знать, может ли ctypes взаимодействовать с mmap. Учитывая mmap.mmap экземпляр и смещение, как я могу получить указатель (c_void_p) в адресное пространство?

Ответы [ 2 ]

12 голосов
/ 04 сентября 2010

Объект mmap «поддерживает интерфейс доступного для записи буфера», поэтому вы можете использовать метод класса from_buffer , который есть у всех классов ctypes с экземпляром mmap в качестве аргумента, для создайте объект ctypes точно так же, как вы хотите, т. е. разделяете память (и, следовательно, лежащий в основе файл), который отображен экземпляр mmap. В частности, я представляю, что вам понадобится подходящий ctypes массив .

1 голос
/ 04 сентября 2010

Помните, что операционная система все равно будет выполнять readahead для read (). Вы будете блокировать либо в read (), либо в write () - одна или другая будут узким местом операции - но даже если вы блокируете одну, это не значит, что другая не выполняется для вас за кадром. Это работа каждой многозадачной операционной системы.

Если вы используете для этого mmap, вы, скорее всего, усложняете работу ОС - усложняете ей задачу определения того, что вы на самом деле просто делаете входящие и исходящие данные, и усложняете ее. сделать чтение вперед. Это все еще можно понять (операционные системы очень хороши в этом), но вы, вероятно, не помогаете.

Единственное преимущество в принципе заключается в том, чтобы избежать затрат на копию памяти, но это не похоже на то, что ваша цель здесь (и если профилирование не говорит иначе, я сильно сомневаюсь, что это поможет производительности).

...