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()
我有多个音频文件需要处理。哪个
使用
librosa
(音频库(读取音频文件用滑动窗口进行
numpy
阵列计算以寻找区域高点使用
2
的结果修改音频文件和视频文件(我没有将其包括在代码中,因为它没有重新发布对于我面临的问题(
我选择multiproccessing.Pool
:有两个原因
- 我认为滑动窗口和音频处理(主要是音频/视频处理(更多地被认为是cpu加载的工作,这将受益于多处理
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
而不是列表理解时是一样的(
- 我注意到一件奇怪的事情是,我的内存使用率开始很高,但几个小时后,它们下降得比理论上应该的要低得多。
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在给定窗口中运行累积总和。