Python: mmap 模块的偏移参数异常
Python: mmap module's offset argument Exception
我正在 32 位 windows(和 python)上处理一个 1.5 GB 的文件并使用 mmap 模块。
如您所见,我正在使用参数 offset=0x5E2030AA
来获取我感兴趣的数据的起点。由于 mmap.mmap 模块的偏移量必须是以下值的倍数mmap.ALLOCATIONGRANULARITY
,我正在使用以下函数来获取最近的偏移量:
def getNearestOffset(offset):
nearest = offset
nearest -= (offset % mmap.ALLOCATIONGRANULARITY)
return nearest
然后我通过从 nearestOffset
.
中减去传递的属性 offset=0x5E2030AA
来寻找剩余的偏移量
def readRIFF(fileno, bufLength=1024**3, offset=0x5E2030AA):
partialData = False
previousRIFF = None
while True:
nearestOffset = getNearestOffset(offset)
with contextlib.closing(mmap.mmap(fileno, bufLength, offset=nearestOffset, access=mmap.ACCESS_READ)) as mm:
if not partialData:
mm.seek(offset - nearestOffset)
startOffset = mm.tell()
riffID = mm.read(4)
assert riffID == "RIFF"
riffSize = toLittleEndianInt(mm.read(4))
riffType = mm.read(4)
riffData = mm.read(riffSize - 4)
# Check for partialData
if len(riffData) != riffSize - 4:
print "DEBUG: Current RIFF blobs trunkated."
partialData = True
previousRIFF = riffBlob.RiffBlob(riffID, riffSize, riffType, riffData, startOffset)
break
但是当我尝试实例化一个新的 mmap 对象时(在 readRIFF 函数中),我得到以下异常:
Traceback (most recent call last):
File "testRead.py", line 57, in <module>
readRIFF(f.fileno())
File "testRead.py", line 28, in readRIFF
with contextlib.closing(mmap.mmap(fileno, bufLength, offset=nearestOffset, access=mmap.ACCESS_READ)) as mm:
WindowsError: [Error 8] Not enough storage is available to process this command
我很困惑,为什么会出现这个异常?
有没有不同的方法来访问我想要的偏移量?
我是否必须修改长度参数,因为我尝试读取超过文件大小?
好的,看来我自己找到了答案。
contextmanager contextlib.closing 实际上并没有从内存中删除创建的内存映射 (?) 因此我的内存在每次新调用时都会慢慢填充它。
我在完成从 blob 中提取相关数据后,通过使用 del(mm)
删除内存映射来解决问题。
我正在 32 位 windows(和 python)上处理一个 1.5 GB 的文件并使用 mmap 模块。
如您所见,我正在使用参数 offset=0x5E2030AA
来获取我感兴趣的数据的起点。由于 mmap.mmap 模块的偏移量必须是以下值的倍数mmap.ALLOCATIONGRANULARITY
,我正在使用以下函数来获取最近的偏移量:
def getNearestOffset(offset):
nearest = offset
nearest -= (offset % mmap.ALLOCATIONGRANULARITY)
return nearest
然后我通过从 nearestOffset
.
offset=0x5E2030AA
来寻找剩余的偏移量
def readRIFF(fileno, bufLength=1024**3, offset=0x5E2030AA):
partialData = False
previousRIFF = None
while True:
nearestOffset = getNearestOffset(offset)
with contextlib.closing(mmap.mmap(fileno, bufLength, offset=nearestOffset, access=mmap.ACCESS_READ)) as mm:
if not partialData:
mm.seek(offset - nearestOffset)
startOffset = mm.tell()
riffID = mm.read(4)
assert riffID == "RIFF"
riffSize = toLittleEndianInt(mm.read(4))
riffType = mm.read(4)
riffData = mm.read(riffSize - 4)
# Check for partialData
if len(riffData) != riffSize - 4:
print "DEBUG: Current RIFF blobs trunkated."
partialData = True
previousRIFF = riffBlob.RiffBlob(riffID, riffSize, riffType, riffData, startOffset)
break
但是当我尝试实例化一个新的 mmap 对象时(在 readRIFF 函数中),我得到以下异常:
Traceback (most recent call last):
File "testRead.py", line 57, in <module>
readRIFF(f.fileno())
File "testRead.py", line 28, in readRIFF
with contextlib.closing(mmap.mmap(fileno, bufLength, offset=nearestOffset, access=mmap.ACCESS_READ)) as mm:
WindowsError: [Error 8] Not enough storage is available to process this command
我很困惑,为什么会出现这个异常? 有没有不同的方法来访问我想要的偏移量? 我是否必须修改长度参数,因为我尝试读取超过文件大小?
好的,看来我自己找到了答案。
contextmanager contextlib.closing 实际上并没有从内存中删除创建的内存映射 (?) 因此我的内存在每次新调用时都会慢慢填充它。
我在完成从 blob 中提取相关数据后,通过使用 del(mm)
删除内存映射来解决问题。