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
相关产品推荐
相关产品推荐

