You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中mmap指定非0offset触发OSError: Invalid argument问题求助

解决Python mmap非0 offset报错OSError: Invalid argument的问题

问题原因

mmap.mmap()的offset参数有硬性要求:必须是系统页面大小的整数倍。这是操作系统内存映射机制的底层限制,内存映射是以页面为最小单位进行的,非页对齐的offset会被系统判定为无效参数,从而抛出OSError: [ERROR 22] Invalid argument。

解决方法

  1. 获取系统页面大小:使用mmap.PAGESIZE(跨平台)直接获取当前系统的页面大小,通常是4KB(4096字节),不同系统可能有差异。
  2. 对齐offset到页边界:将传入的offset调整为最近的页对齐数值,映射后再通过切片定位到实际需要的起始位置。

修改后的代码示例:

import mmap
import sys

# 建议以二进制模式打开文件,避免文本模式的编码/换行转换干扰偏移计算
with open(sys.argv[1], 'rb') as f:
    off = int(sys.argv[2])
    page_size = mmap.PAGESIZE
    # 计算对齐到页面大小整数倍的offset
    aligned_offset = (off // page_size) * page_size
    # 执行内存映射
    mm = mmap.mmap(f.fileno(), length=0, access=mmap.ACCESS_READ, offset=aligned_offset)
    # 通过切片跳过对齐前的多余部分,得到从目标off位置开始的内容
    target_mm = mm[off - aligned_offset:]
    
    # 示例:读取100字节内容
    print(target_mm.read(100))

补充说明

  • 用with语句管理文件句柄更安全,避免资源泄漏。
  • 二进制模式打开文件能保证偏移计算的准确性,文本模式下的换行符转换等操作会导致实际文件偏移与预期不符。

内容的提问来源于stack exchange,提问作者vtable

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 06:43:13