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

Windows多进程场景下Pandas/SciPy提交内存占用过高问题求助

Windows下Python多进程中降低Pandas/SciPy提交内存占用的方案

更新:发布此问题后,发现SciPy也存在相同问题,故更新标题以便他人检索,原问题保留,下方提供解决方案。

原问题

在Windows系统的Python多进程应用中,能否降低Pandas的提交内存占用?

我开发了一款Windows下的Python多进程应用,频繁出现MemoryErrors,主要原因是每个子进程都要导入Pandas。导入Pandas时,任务管理器显示提交内存增加约0.5GB;在16核环境下多进程运行时,仅导入环节就占用8GB提交内存,导致应用运行前内存不足,引发MemoryErrors。而私有工作内存并未同步增长,因此RAM并非瓶颈。

我考虑增大页面文件(pagefile),但这并非理想方案,因为应用将部署给其他用户。请问在Windows系统下,是否有办法减小导入内存占用,比如跨子进程共享导入内容,或通过特定Pandas版本/参数减少内存分配?

环境信息:Python:3.11(64位),Pandas:2.0.3,操作系统:Windows 10 Enterprise

解决方案

1. 提前在主进程导入模块,利用Copy-On-Write特性

Windows下Python的multiprocessing默认用spawn启动子进程,会重新初始化解释器并重复导入模块。把Pandas/SciPy的导入放在主进程中,再创建子进程,子进程可以共享主进程已加载的模块只读内存页面(仅当内容被修改时才会复制),避免重复导入的提交内存开销。

示例代码:

import pandas as pd
import scipy
from multiprocessing import Pool

def worker_task(data):
    # 子进程直接使用主进程已导入的模块
    return pd.DataFrame(data).sum()

if __name__ == "__main__":
    # 主进程提前加载大模块
    with Pool(processes=4) as pool:
        results = pool.map(worker_task, [[1,2,3], [4,5,6]])
    print(results)

2. 使用forkserver启动方式(Python 3.4+支持)

forkserver会先启动一个独立的服务器进程,所有子进程都从该服务器进程fork生成。在服务器进程中提前导入Pandas/SciPy,所有子进程可共享这些模块的内存空间,彻底避免重复导入的内存消耗。

示例配置:

from multiprocessing import set_start_method, Pool
import pandas as pd
import scipy

def worker_task(data):
    return pd.DataFrame(data).mean()

if __name__ == "__main__":
    set_start_method('forkserver')
    # forkserver启动后导入模块,确保服务器进程加载
    with Pool(processes=4) as pool:
        results = pool.map(worker_task, [[1,2], [3,4]])
    print(results)

注意:Windows下使用forkserver需要安装pywin32依赖,执行pip install pywin32即可。

3. 精简模块导入范围

如果仅用到Pandas/SciPy的部分功能,可只导入需要的子模块,减少不必要的依赖加载:

# 替代全量导入import pandas as pd
from pandas import DataFrame, Series

这种方式效果有限,但能小幅降低内存占用。

4. 升级到最新稳定版

Pandas 2.x系列相比1.x在导入内存占用上有优化,SciPy的新版本也持续推进内存管理改进,升级到最新稳定版可缓解问题。

5. 合理限制进程数量

不要直接使用CPU核心数设置进程池大小,比如16核环境下将进程数设为8,可直接将导入环节的提交内存占用减半,避免内存过载。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 00:50:08