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

如何在多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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 16:57:37