numpy数组的多进程速度较慢


class MyClass():
def __init__(self, audio_file_path):
self.audio_file_path = audio_file_path
***other variables
def sliding_window_function(audio_file_path):
y, sr = librosa.load(audio_file_path)
timestamps = np.arange(0, len(y)) / sr
aby = np.abs(y)
del(y)
stamps_in_a_second = timestamps.shape[0]/librosa.get_duration(y=aby, sr=sr) 
del(timestamps)
scan_window_size = int(self.wanted_window_length*stamps_in_a_second)        
qth_amp = np.quantile(aby, self.wanted_quantile_threshold)            
adj_qth_amp = qth_amp*scan_window_size                                    
window_sum = sum(aby[:scan_window_size])
wanted_time_stamps = [[i, window_sum]
for i in range(len(aby) - scan_window_size)
if (window_sum := window_sum - aby[i] + aby[scan_window_size+i]) > adj_qth_amp ]
del(aby)
def process_audio():
wanted_time_stamps = sliding_window_function(self.audio_file_path)
for time_stamp in wanted_time_stamps:
#dosomething
def main(file_path):
myclass = MyClass(file_path)
myclass.process_audio()
if __name__ == "__main__":
pool = multiprocessing.Pool()
for file in file_path:
try:
pool.apply_async(main, args=(file,))
except:
pass
pool.close()
pool.join()

我有多个音频文件需要处理。哪个

  1. 使用librosa(音频库(读取音频文件

  2. 用滑动窗口进行numpy阵列计算以寻找区域高点

  3. 使用2的结果修改音频文件和视频文件(我没有将其包括在代码中,因为它没有重新发布对于我面临的问题(

我选择multiproccessing.Pool:有两个原因

  1. 我认为滑动窗口和音频处理(主要是音频/视频处理(更多地被认为是cpu加载的工作,这将受益于多处理
  2. Pool允许我限制工人同时工作,这允许我根据自己的需求分配计算能力

我的问题:

1.初始化Pool并运行代码后,一切都是跑了很长时间,都卡在了滑动车窗上功能:

for i in range(len(aby) - scan_window_size)
if (window_sum := window_sum - aby[i] + aby[scan_window_size+i]) > adj_qth_amp ] 

特别是

for i in range(len(aby) - scan_window_size)
if (window_sum := window_sum - aby[i] + aby[scan_window_size+i]) > adj_qth_amp

我的cpu使用率和电源使用率仍然在上升,但池中的每个进程似乎都在运行当我发送KeyboardInterupt时,这两行(当使用for loop+append而不是列表理解时是一样的(

  1. 我注意到一件奇怪的事情是,我的内存使用率开始很高,但几个小时后,它们下降得比理论上应该的要低得多。aby应该是一个接近1GB的数组,但每个进程都只使用RAM的500MB。但我的代码还没有到达del(aby)

我鼓励您尽可能使用numpy内部函数,它们比多处理快得多,并且在合理的情况下已经是多线程的了。

例如:

import numpy as np
# 100M values
x = np.random.uniform(size=100_000_000)
windowed_sum = np.convolve(x, np.ones_like(x, shape=10), 'valid')
ix, = np.where(windowed_sum > 9)

将可能>将单个值从Numpy中提取到Python中,这比您所做的工作快100倍。在可能的情况下,我也会尝试在Python之外进行并行处理,这往往会使推理和调试变得更容易。

有关高效计算运行总和的其他方法,请参阅Python在给定窗口中运行累积总和。

最新更新