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

Python调用win32file.ReadFile读取大内存整数错误修复咨询

解决win32file.ReadFile读取大内存时的TypeError问题

问题核心

win32file.ReadFile的第二个参数不支持直接传入超大整数(如8GB对应的字节数),该参数仅接受小整数(单次读取的合理字节数)或可写入的缓冲区对象,传入过大整数会触发类型错误。

解决方案

  • 拆分大内存读取为小块循环执行
    不要尝试一次性读取8GB内存,将读取操作拆分为固定大小的块(比如64MB/128MB),循环读取并写入输出文件:

    import win32file
    import win32api
    
    # 定义单次读取的块大小(可根据系统性能调整)
    CHUNK_SIZE = 64 * 1024 * 1024  # 64MB
    TOTAL_MEM_SIZE = 8 * 1024 * 1024 * 1024  # 目标读取的8GB内存
    
    bytes_processed = 0
    output_file = open("memory_dump.raw", "wb")
    
    try:
        while bytes_processed < TOTAL_MEM_SIZE:
            # 计算当前需要读取的块大小(最后一块可能小于CHUNK_SIZE)
            current_read_size = min(CHUNK_SIZE, TOTAL_MEM_SIZE - bytes_processed)
            # 创建对应大小的可写入缓冲区
            read_buffer = win32file.AllocateReadBuffer(current_read_size)
            # 执行读取操作
            status, read_data = win32file.ReadFile(device_handle, read_buffer, None)
            
            if status != 0:
                raise win32api.error(status, win32api.FormatMessage(status))
            
            output_file.write(read_data)
            bytes_processed += len(read_data)
    finally:
        output_file.close()
    
  • 用缓冲区替代大整数参数
    无论读取大小,始终使用win32file.AllocateReadBuffer创建缓冲区作为ReadFile的第二个参数,避免直接传入大整数。该函数会根据指定大小分配适配的内存块,符合ReadFile的参数要求。

  • 确认winpmem驱动的单次读取上限
    winpmem驱动对单次读取的内存块大小可能存在限制,建议将拆分的块大小控制在驱动允许的范围内(通常不超过256MB),避免触发驱动层面的限制。

内容的提问来源于stack exchange,提问作者Ali Can Gönüllü

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 03:43:17