我一直在使用 librosa 音频库来从音频文件中提取功能。
我想要处理一百首歌曲,因为将每首歌曲加载到内存并提取功能需要很长时间,所以我开始使用 concurrent.futures中的 ProcessPoolExecutor 模块并将我的 get_features(歌曲)功能映射到百首歌曲列表。
它确实加快了这个过程,可能快了大约8到10倍(4核8线程CPU)。
但是,当我一次又一次地运行脚本时,脚本的运行时间会变得更高。
在20首歌曲的样本中, ProcessPool 花了大约50秒来处理所有歌曲(大约500秒没有ProcessPool)。当我再次运行脚本时,它花了大约200秒来完成处理。
但如果我重新启动电脑并再次运行脚本,则前几次运行需要50秒,之后需要200秒或更长时间。
此外我还有我的系统监视器,并注意到当脚本开始运行时,我的所有内核都100%并且内存消耗增加了一个千兆字节或者所以。但是在脚本退出后,核心变得正常,但内存仍未清除。对于后续的脚本运行,内存消耗进一步增加几百兆,甚至在脚本完成后,内存也不会被清除。
这是正常的吗?我的意思是,这是由于操作系统使用系统资源的方式。像:
我完全不解。
PC配置:英特尔酷睿i7第7代,16 GB内存 - 戴尔7567