如何在多Python运行实例间共享all_feats变量以节省内存?
多Python实例共享大型只读数据集的问题
背景
原始Python脚本因重复磁盘读取导致运行缓慢:
for epoch in range(num_epochs): for bag in range(num_bags): feats = pd.read_csv(f"feats_{bag}.csv") ... # 业务逻辑
每个feats_{bag}.csv文件会被读取num_epoch次,磁盘IO成为性能瓶颈。
尝试预加载所有数据到内存提速,但内存占用过高:
all_feats = [pd.read_csv(f"feats_{bag}.csv") for bag in range(num_bags)] for epoch in range(num_epochs): for bag in range(num_bags): feats = all_feats[bag]
all_feats占用约20GB内存,64GB服务器仅能同时运行3个程序实例。由于所有实例都使用同一组只读数据,希望仅加载一次数据,供多个Python脚本/实例共享,以提升并发量。
尝试的方案及问题
1. 使用multiprocessing.shared_memory
尝试通过共享内存实现数据复用,但未达到预期效果:
服务端代码:
from multiprocessing import shared_memory all_feats = [pd.read_csv(f"feats_{bag}.csv") for bag in range(num_bags)] sl = shared_memory.ShareableList(all_feats, name='all_feats')
客户端代码:
from multiprocessing import shared_memory all_feats = shared_memory.ShareableList(name='all_feats') print(id(all_feats), all_feats)
运行客户端时,每次输出的all_feats的id都不同,说明内存地址未共享,客户端仍在内存中创建了数据副本,未实现内存复用。
2. Redis内存数据库方案
考虑将all_feats存入Redis,每次迭代从Redis读取对应数据:
for epoch in range(num_epochs): for bag in range(num_bags): feats = redis.get(f"bag_{bag}") ... # 业务逻辑
虽然从内存读取比磁盘快,但性能可能不如直接从Python内存中读取,暂未采用。
注:拆分数据分批预加载的方案不可行。
核心疑问
multiprocessing.shared_memory是否能解决多Python实例共享同一只读数据集的问题?- 为什么客户端中
all_feats的id每次都不同?
内容的提问来源于stack exchange,提问作者Danial
相关产品推荐
相关产品推荐

