Python中使用mmap时offset参数必须为内存分配粒度的整数倍-Python教程

使用python的`mmap`模块时,若传入的`offset`参数不是系统内存分配粒度(`mmap.allocationgranularity`)的整数倍,或超出文件实际大小,将触发`oserror: [errno 22] invalid argument`错误。

mmap并非任意偏移均可映射——它底层依赖操作系统的内存映射机制,而操作系统要求映射起始地址(即offset)必须对齐到特定边界,该边界由mmap.ALLOCATIONGRANULARITY定义(在大多数现代Linux/macOS系统上为4096字节,Windows通常也为4096,但可能因架构略有差异)。即使文件本身支持字节级寻址,mmap的offset也必须是该粒度的整数倍;否则内核直接拒绝映射请求,抛出“Invalid argument”。

此外,offset还须满足:offset + length ≤ 文件大小(当length=0时,表示映射从offset到文件末尾,因此要求offset ≤ 文件大小)。若offset越界,同样会报错。

✅ 正确用法示例:

import mmap
import os
import sys

if len(sys.argv) != 3:
    print("Usage: python script.py  ")
    sys.exit(1)

filepath = sys.argv[1]
offset = int(sys.argv[2])

# 获取文件大小与对齐粒度
with open(filepath, 'rb') as f:
    file_size = os.fstat(f.fileno()).st_size
    granularity = mmap.ALLOCATIONGRANULARITY

# 校验 offset 对齐性与范围
if offset % granularity != 0:
    raise ValueError(f"offset {offset} is not a multiple of ALLOCATIONGRANULARITY ({granularity})")

if offset > file_size:
    raise ValueError(f"offset {offset} exceeds file size {file_size}")

# 安全打开并映射
with open(filepath, 'rb') as f:
    mm = mmap.mmap(f.fileno(), length=0, access=mmap.ACCESS_READ, offset=offset)
    print(f"Successfully mapped {len(mm)} bytes starting at offset {offset}")
    # 示例:读取前16字节
    print("First 16 bytes:", mm[:16].hex() if len(mm) >= 16 else mm[:].hex())

⚠️ 注意事项:

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » Python中使用mmap时offset参数必须为内存分配粒度的整数倍-Python教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4006099+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4006099+
  • 本周更新: 0+
  • 最后更新: 2026-03-16