Хорошо, глядя на код mmap .c, я не верю, что он поддерживает этот вариант использования.Кроме того, я обнаружил, что производительность в значительной степени отстой - для моего случая использования.Мне было бы любопытно, какую производительность видят другие, но я обнаружил, что для обхода двоичного файла объемом 500 МБ в Python требуется около 40 секунд.Это создание mmap, затем превращение местоположения в объект ctype с помощью from_buffer () и использование объекта ctypes для расшифровки размера объекта, чтобы я мог перейти к следующему объекту.Я пытался сделать то же самое прямо в C ++ из MSVC.Очевидно, что здесь я мог привести непосредственно к объекту правильного типа, и это было быстро - меньше секунды (это с ядром Core 2 Quad и SSD).
Я обнаружил, что могу получить указательсо следующим
firstHeader = CEL_HEADER.from_buffer(map, 0) #CEL_HEADER is a ctypes Structure
pHeader = pointer(firstHeader)
#Now I can use pHeader[ind] to get a CEL_HEADER object
#at an arbitrary point in the file
Это не решает исходную проблему - mmap не доступен только для чтения, поскольку мне все еще нужно использовать from_buffer для первого вызова.В этом конфиге обработка файла заняла около 40 секунд, поэтому похоже, что преобразование указателя в структуру ctypes снижает производительность.Это всего лишь предположение, но я не вижу особой ценности в дальнейшем его отслеживании.
Я не уверен, что мой план поможет кому-то еще, но я собираюсь попытаться создать модуль переменного тока.специфичные для моих потребностей на основе кода mmap.Я думаю, что могу использовать быструю обработку c-кода для индексации двоичного файла, а затем выставлять только небольшие части файла за один раз посредством вызовов в объекты ctypes / python.Пожелайте мне удачи.
Также, как примечание, Python 2.7.2 был выпущен сегодня (6/12/11), и одним из изменений является обновление кода mmap, чтобы вы могли использоватьpython long для установки смещения файла.Это позволяет использовать mmap для файлов размером более 4 ГБ в 32-разрядных системах.См. Выпуск № 4681 здесь