Python处理海量数据时如何将变量存储在SSD磁盘而非内存中
Python海量组合计算内存溢出落盘SSD方案
- 首先确认内存溢出的核心诱因:
itertools提供的组合、排列生成接口本身是惰性迭代器,正常逐行迭代时仅会在内存中保留当前1组计算结果,内存占用稳定在极低水平。绝大多数内存溢出场景都是因为主动调用了list()/set()等方法把所有生成结果一次性加载到内存导致的,如果业务逻辑允许,优先直接在迭代循环内完成业务计算,用完即弃当前组合,从根源上不需要额外存储。 - 如果确实需要持久化存储中间结果到高速SSD替代内存,可直接使用以下原生方案,不需要额外安装第三方依赖:
- 内存映射方案:使用内置
mmap模块将SSD上的文件直接映射到进程地址空间,由操作系统自动完成内存与SSD间的页调度,顺序读写性能接近原生内存速度,适合批量顺序存储组合结果。
最简实现参考:import mmap import itertools # 在SSD分区创建存储文件 with open("combo_storage.bin", "wb+") as f: # 按预估数据量预分配文件空间,例:单条组合占8字节、共1亿条则分配8e8字节 f.truncate(8 * 100000000) with mmap.mmap(f.fileno(), 0) as mm: write_offset = 0 source_str = "your_target_string" # 逐组生成组合,直接写入映射区域,不会占满运行内存 for combo in itertools.permutations(source_str, r=5): combo_bytes = "".join(combo).encode("utf-8") mm[write_offset:write_offset+len(combo_bytes)] = combo_bytes write_offset += len(combo_bytes) - 结构化存储方案:如果需要随机读取存储的中间结果,不需要手动管理文件偏移,可使用内置
dbm模块,接口和Python字典完全一致,所有数据自动落盘到SSD,仅在读取对应键时才加载少量数据到内存;如果存储的是数值型数组类结果,可使用numpy.memmap,针对数组场景做了专门优化,调用逻辑和普通numpy数组完全一致。
- 内存映射方案:使用内置
- 额外注意:字符串全排列/全组合的量级会随字符串长度指数级增长,比如长度为20的字符串生成10位排列总规模可达670亿条,就算写入SSD也会占用数百GB空间,优先调整业务逻辑实现边生成边计算,避免全量存储。
高速SSD做存储介质时,尽量保持顺序写入,避免高频小块随机覆写,可最大化发挥SSD的读写性能,实际处理速度可达到内存的1/10左右,完全满足海量数据离线处理需求。
内容的提问来源于stack exchange,提问作者Coolcreeper
相关产品推荐
相关产品推荐

