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

Python跨模块复用已加载大数据文件的问题求助

解决多Python脚本复用大型加载数据的内存问题

你的问题核心在于:每个Python脚本都是独立运行的进程,导入config.py时,每个进程都会重新执行模块内的代码,导致大型文件被重复加载,占用多份内存。下面提供几种可行的解决方案:


方案1:基于多进程共享内存(适合批量运行脚本)

用一个主进程一次性加载数据,再启动子进程运行各个脚本,子进程通过共享内存访问数据,避免重复加载。

步骤:

  1. 编写主入口脚本main.py:
import multiprocessing as mp
import pandas as pd
# 导入各脚本的处理逻辑(需要把脚本代码封装成函数)
from script1 import process_data as process_script1
from script2 import process_data as process_script2

def main():
    # 仅加载一次大型数据
    large_file = pd.read_csv('large_file.csv')
    
    # 使用Manager创建可跨进程共享的字典
    with mp.Manager() as manager:
        shared_data = manager.dict()
        shared_data['large_file'] = large_file
        
        # 启动子进程运行各脚本逻辑
        p1 = mp.Process(target=process_script1, args=(shared_data,))
        p2 = mp.Process(target=process_script2, args=(shared_data,))
        
        p1.start()
        p2.start()
        p1.join()
        p2.join()

if __name__ == '__main__':
    main()
  1. 修改script1.py,将逻辑封装为函数:
def process_data(shared_data):
    large_file = shared_data['large_file']
    print(large_file.shape)
    # 这里写你的业务逻辑
  1. script2.py做同样修改即可。

方案2:基于Redis缓存(适合脚本独立启动)

将数据一次性加载到Redis内存数据库,各个脚本直接从Redis读取序列化后的数据集,数据仅存储一份。

步骤:

  1. 先安装依赖:
pip install redis pandas
  1. 编写数据加载脚本load_data_to_redis.py:
import pandas as pd
import redis
import pickle

# 连接本地Redis服务(确保Redis已启动)
r = redis.Redis(host='localhost', port=6379, db=0)

# 加载数据并序列化存入Redis
large_file = pd.read_csv('large_file.csv')
r.set('large_dataset', pickle.dumps(large_file))
  1. 修改script1.py:
import redis
import pickle

# 连接Redis
r = redis.Redis(host='localhost', port=6379, db=0)
# 读取并反序列化数据
large_file = pickle.loads(r.get('large_dataset'))
print(large_file.shape)
  1. script2.py复用上述读取逻辑即可。

方案3:基于内存映射文件(适合超大只读文件)

利用操作系统的内存映射机制,让多个进程共享同一个文件的内存映射区域,减少内存重复占用。

修改config.py:

import pandas as pd
import mmap

# 创建文件的只读内存映射
with open('large_file.csv', 'rb') as f:
    mm = mmap.mmap(f.fileno(), length=0, access=mmap.ACCESS_READ)
    # 从内存映射读取数据
    large_file = pd.read_csv(mm)

注意:此方案中pandas会将映射数据复制到自身内存空间,内存节省效果不如前两种,但无需额外依赖,适合快速测试。


关键注意点

  • 由于所有脚本仅只读数据,无需处理并发修改的锁机制,实现更简单;
  • 方案1适合需要批量运行多个脚本的场景,方案2适合脚本需要单独启动、灵活调度的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 11:58:03