Почему я не могу создать новый файл с mmap известного размера?

Я пытаюсь создать файл с отображением в памяти, как это

size = 83456
self.file = open("/tmp/installer.ipk", "r+b")
self.mm = mmap.mmap(self.file.fileno(), size, access=mmap.ACCESS_WRITE)

но я получаю следующее исключение

Traceback (most recent call last):
   ...
  File "./dept_sensor_service.py", line 70, in handle_control
    self.mm = mmap.mmap(self.file.fileno(), size, access=mmap.ACCESS_WRITE)
ValueError: mmap length is greater than file size

Файл /tmp/installer.ipk не существует, пока я не запустил это. Я хочу, чтобы скрипт создал файл с именем /tmp/installer.ipk и заполнен 83456 нулями. Согласно документации по питону для mmap:

Если длина больше текущего размера файла, файл расширяется, чтобы содержать байты длины

Я играл с различными разрешениями, но я думаю, что 'r+b' для файла и ACCESS_WRITE для карты будет правильно.

Это на биглебоне Linux box. Кстати, я бы использовал with open(...) as f: шаблон, но я не могу в этом случае, так как mmap должен оставаться открытым после возврата функции.

1 ответ

Решение

Unix-версия mmap не увеличивает файл автоматически, но вы можете просто записать в файл нули, например:

size = 83456
self.file = open("/tmp/installer.ipk", "w+b")
self.file.write("\0" * size)
self.file.flush()
self.mm = mmap.mmap(self.file.fileno(), size, access=mmap.ACCESS_WRITE)
Другие вопросы по тегам