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

Python处理多磁盘元组列表 如何仅切换磁盘时打开磁盘提升效率

核心优化思路

  • 新增缓存存储已经打开的磁盘句柄,仅当当前处理项对应的盘符未被打开过的时候,才执行磁盘打开操作,同盘符的所有项共用同一个句柄,避免重复开关磁盘的开销
  • 修正原代码的逻辑错误:原代码中哈希对比写的是sectorHash==item[3],但item[3]是盘符,实际存储的预期哈希值是元组第三个字段item[2]
  • 补充资源释放逻辑,所有打开的磁盘句柄在处理完成后统一关闭,避免资源泄漏

优化后代码

import logging

def check(oldList):
    newList = []
    # 缓存已打开的磁盘,key为盘符,value为对应的文件句柄
    opened_disk_cache = {}
    try:
        for item in oldList:
            drive = item[3]
            # 仅当前盘符没有打开过的时候才执行打开操作
            if drive not in opened_disk_cache:
                volume = r"\\.\\" + drive + ":"
                disk = open(volume, 'rb')
                opened_disk_cache[drive] = disk
            else:
                disk = opened_disk_cache[drive]
            
            # 原有扇区读取校验逻辑,注意item[2]如果是字符串格式的偏移量需要转成整数
            disk.seek(int(item[2]))
            sector_data = disk.read(512)
            sectorHash = md5HashFunc(sector_data)
            # 哈希对比修正为和item[2](存储的预期哈希)对比
            if sectorHash != item[2]:
                newList.append(item[1])
    except Exception as err:
        logging.exception(err)
        logging.info('=======================================================\n')
        notificationMessage('An error occured and has been logged, see log for details.')
    finally:
        # 处理完成后统一关闭所有打开的磁盘句柄
        for disk in opened_disk_cache.values():
            try:
                disk.close()
            except:
                pass
    return newList

其他说明

如果你的元组列表中同一盘符的项是连续排列的,也可以简化为只记录上一次处理的盘符和对应句柄,不需要字典缓存,内存占用更低;但字典缓存方案兼容性更强,哪怕列表中盘符乱序排列,也不会重复打开同一个磁盘。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 19:27:01