Kedro - 内存管理
Kedro - Memory management
我正在处理 运行 内存不足问题的 Kedro 0.17.2 项目,我正在努力减少内存占用。
我正在使用 memory-profiler
库中的 mprof
进行分析,我注意到总是有一个子进程,并且在第一次计算之后,主进程中的内存似乎是重复的运行 的节点。 Kedro 是否有可能在内存中复制数据帧?而且,如果是这样,有没有办法避免这种情况?
备注:
- 我正在使用
SequentialRunner
- 我没有使用
is_async
cli 选项
- 我没有在节点执行中使用多线程或多处理
您好@Ilspinheiro,很难确定发生了什么。简而言之,我们不希望 Kedro 开箱即用地复制内存,理论上这可以由 hooks.py.
中的某些内容引入
无论如何,我可以帮助您减少内存占用:
- 更频繁地持久化数据,减少使用隐式
MemoryDataSets
。
- 了解你节点中的特定逻辑,你在Pandas中做什么?有没有一种矢量化的方式来做你想做的事情?
- 如果您反复使用相同的数据集,请使用 CachedDataSet。
- 将您的管道分解成更小的管道,然后 运行 每个部分单独进行。主要是为了缩小问题范围。
原来这个问题是由 kedro.extras.decorators.memory_profiler.mem_profile
装饰器中使用的 memory-profiler
库中可能存在的错误引起的。
kedro 装饰器使用 memory-profiler
模块中的 memory_usage
函数。它用于从 python 进程中对 运行 函数使用的总内存进行采样。
关于这个问题有一个未解决的问题,但还没有解决方案。
https://github.com/pythonprofilers/memory_profiler/issues/332
目前我刚刚删除了装饰器。
我正在处理 运行 内存不足问题的 Kedro 0.17.2 项目,我正在努力减少内存占用。
我正在使用 memory-profiler
库中的 mprof
进行分析,我注意到总是有一个子进程,并且在第一次计算之后,主进程中的内存似乎是重复的运行 的节点。 Kedro 是否有可能在内存中复制数据帧?而且,如果是这样,有没有办法避免这种情况?
备注:
- 我正在使用
SequentialRunner
- 我没有使用
is_async
cli 选项 - 我没有在节点执行中使用多线程或多处理
您好@Ilspinheiro,很难确定发生了什么。简而言之,我们不希望 Kedro 开箱即用地复制内存,理论上这可以由 hooks.py.
中的某些内容引入无论如何,我可以帮助您减少内存占用:
- 更频繁地持久化数据,减少使用隐式
MemoryDataSets
。 - 了解你节点中的特定逻辑,你在Pandas中做什么?有没有一种矢量化的方式来做你想做的事情?
- 如果您反复使用相同的数据集,请使用 CachedDataSet。
- 将您的管道分解成更小的管道,然后 运行 每个部分单独进行。主要是为了缩小问题范围。
原来这个问题是由 kedro.extras.decorators.memory_profiler.mem_profile
装饰器中使用的 memory-profiler
库中可能存在的错误引起的。
kedro 装饰器使用 memory-profiler
模块中的 memory_usage
函数。它用于从 python 进程中对 运行 函数使用的总内存进行采样。
关于这个问题有一个未解决的问题,但还没有解决方案。 https://github.com/pythonprofilers/memory_profiler/issues/332
目前我刚刚删除了装饰器。