Python跨模块复用已加载大数据文件的问题求助
解决多Python脚本复用大型加载数据的内存问题
你的问题核心在于:每个Python脚本都是独立运行的进程,导入config.py时,每个进程都会重新执行模块内的代码,导致大型文件被重复加载,占用多份内存。下面提供几种可行的解决方案:
方案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()
- 修改
script1.py,将逻辑封装为函数:
def process_data(shared_data): large_file = shared_data['large_file'] print(large_file.shape) # 这里写你的业务逻辑
script2.py做同样修改即可。
方案2:基于Redis缓存(适合脚本独立启动)
将数据一次性加载到Redis内存数据库,各个脚本直接从Redis读取序列化后的数据集,数据仅存储一份。
步骤:
- 先安装依赖:
pip install redis pandas
- 编写数据加载脚本
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))
- 修改
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)
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
相关产品推荐
相关产品推荐

