concurrent.futures模块的奇怪行为

时间:2018-06-08 09:33:10

标签: python multithreading memory-management operating-system concurrent.futures

我一直在使用 librosa 音频库来从音频文件中提取功能。

我想要处理一百首歌曲,因为将每首歌曲加载到内存并提取功能需要很长时间,所以我开始使用 concurrent.futures中的 ProcessPoolExecutor 模块并将我的 get_features(歌曲)功能映射到百首歌曲列表。

它确实加快了这个过程,可能快了大约8到10倍(4核8线程CPU)。

但是,当我一次又一次地运行脚本时,脚本的运行时间会变得更高。

在20首歌曲的样本中, ProcessPool 花了大约50秒来处理所有歌曲(大约500秒没有ProcessPool)。当我再次运行脚本时,它花了大约200秒来完成处理。

但如果我重新启动电脑并再次运行脚本,则前几次运行需要50秒,之后需要200秒或更长时间。

此外我还有我的系统监视器,并注意到当脚本开始运行时,我的所有内核都100%并且内存消耗增加了一个千兆字节或者所以。但是在脚本退出后,核心变得正常,但内存仍未清除。对于后续的脚本运行,内存消耗进一步增加几百兆,甚至在脚本完成后,内存也不会被清除。

这是正常的吗?我的意思是,这是由于操作系统使用系统资源的方式。像:

  • 如果CPU温度上升,操作系统是否会降低执行速度? (或)
  • '内存未清除'的问题是由于操作系统正在进行一些缓存?

我完全不解。

  

PC配置:英特尔酷睿i7第7代,16 GB内存 - 戴尔7567

0 个答案:

没有答案