используя numpy.memmap для сопоставления файла устройства - PullRequest
3 голосов
/ 14 февраля 2011

Есть ли причина, по которой открытие файла устройства (а не обычного файла) с использованием memmap numpy не должно работать?

self.surface = np.memmap('/dev/fb1', dtype=np.uint16, mode='r+', shape=(320,240))

Я работаю с пользовательским модулем ядра, который добавляет устройство кадрового буфера, которое отлично работает с обычным mmap модулем Python. Но использование numpy может повредить мьютекс ядра при доступе к файловой системе или что-то в этом роде (я действительно не совсем уверен, что происходит).

Мой вопрос, в частности, заключается в том, что это что-то, что memmap Numpy не может обработать, и я должен пойти другим путем?

Я задал еще один вопрос по unix stackexchange , но мне кажется, что это 2 разных вопроса, поэтому я отправил их оба.

Очевидно, что это в Linux (Kubuntu Maverick с пользовательским модулем ядра)

Обновление

Что ж, получается, что я могу нормально создать memmap. Кажется, что проблема заключается в том, что когда я закрываю процесс без специального закрытия объекта memmap, он просто зависает на мьютексе в ядре.

Понятия не имею, связана ли эта проблема с numpy, или с моим модулем ядра, или где-то еще.

1 Ответ

1 голос
/ 17 мая 2011

Если ваш код работает нормально с модулем python mmap, вы можете использовать его напрямую вместо numpy.memmap:

>>> fd = os.open("a", os.O_RDWR)
>>> buffer = mmap.mmap(fd, 0)
>>> surface = np.ndarray((320,240), np.uint16, buffer)

Это имеет еще одно преимущество: у вас больше возможностей контролировать отображение памятиused.

Теперь у Python mmap есть свои особенности.Как показывает источник , он вызывает msync при распределении.Может быть, это где ваша программа висит?(Возможно, вы сможете воспроизвести вашу проблему с помощью buffer.flush (), который также вызывает msync).Ваше решение вызова close () сначала, вероятно, работает, потому что оно обходит msync!

...