【问题标题】:Why can't I create a new file with mmap of known size?为什么我不能使用已知大小的 mmap 创建新文件?
【发布时间】:2014-01-15 08:16:52
【问题描述】:

我正在尝试创建这样的内存映射文件

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的python文档:

如果长度大于文件的当前大小,则将文件扩展为包含 长度字节

我尝试过各种权限,但我认为文件的'r+b' 和地图的ACCESS_WRITE 是正确的。

这是在一个 beaglebone Linux 机器上。顺便说一句,我会使用with open(...) as f: 模式,但在这种情况下我不能,因为在函数返回后 mmap 必须保持打开状态。

【问题讨论】:

    标签: python mmap


    【解决方案1】:

    mmap 的 unix 版本不会自动增大文件,但您可以自己将零写入文件,例如:

    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)
    

    【讨论】:

    猜你喜欢
    • 2010-12-12
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多