Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法对librosa melspectrogram使用多线程_Python_Multithreading_Ffmpeg_Librosa - Fatal编程技术网

Python 无法对librosa melspectrogram使用多线程

Python 无法对librosa melspectrogram使用多线程,python,multithreading,ffmpeg,librosa,Python,Multithreading,Ffmpeg,Librosa,我有超过1000个音频文件(这只是一个初步的发展,在未来,将有更多的音频文件),并希望将它们转换为melspectrogram 因为我的工作站有一个Intel®Xeon®处理器E5-2698 v3,它有32个线程,所以我想使用多线程来完成我的工作 我的代码 我的问题 但是,我的脚本在完成第一次转换后冻结 为了调试正在发生的事情,我注释掉了s=librosa.feature.melspectrogram(y=y,sr=sr,n_-mels=128,fmax=8000),并将其替换为s=0。 然后,

我有超过1000个音频文件(这只是一个初步的发展,在未来,将有更多的音频文件),并希望将它们转换为melspectrogram

因为我的工作站有一个Intel®Xeon®处理器E5-2698 v3,它有32个线程,所以我想使用多线程来完成我的工作

我的代码 我的问题 但是,我的脚本在完成第一次转换后冻结

为了调试正在发生的事情,我注释掉了
s=librosa.feature.melspectrogram(y=y,sr=sr,n_-mels=128,fmax=8000)
,并将其替换为
s=0
。 然后,多线程代码可以正常工作

librosa.feature.melspectrogram函数有什么问题?它不支持多线程吗?还是ffmpeg的问题?(当使用librosa时,它要求我之前安装ffmpeg。)

我建议使用来与librosa并行处理。我相信librosa正在内部使用它,所以这可能会避免一些冲突。下面是一个工作示例,基于我经常用来处理大约10k文件的代码

import os.path
import joblib
import librosa
import numpy

def compute(inpath, outpath):
    y, sr = librosa.load(inpath)
    S = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=128, fmax=8000)
    numpy.save(outpath, S)
    return outpath

out_dir = 'temp/'
n_jobs=8
verbose=1

# as an reproducable example just processes the same input file
# but making sure to give them unique output names
inputs = [ librosa.util.example_audio_file() ] * 10
outputs = [ os.path.join(out_dir, '{}.npy'.format(n)) for n in range(len(inputs)) ]

jobs = [ joblib.delayed(compute)(i, o) for i,o in zip(inputs, outputs) ]
out = joblib.Parallel(n_jobs=n_jobs, verbose=verbose)(jobs)

print(out)
输出

[Parallel(n_jobs=8)]: Using backend LokyBackend with 8 concurrent workers.
[Parallel(n_jobs=8)]: Done   6 out of  10 | elapsed:   10.4s remaining:    6.9s
[Parallel(n_jobs=8)]: Done  10 out of  10 | elapsed:   13.2s finished
['temp/0.npy', 'temp/1.npy', 'temp/2.npy', 'temp/3.npy', 'temp/4.npy', 'temp/5.npy', 'temp/6.npy', 'temp/7.npy', 'temp/8.npy', 'temp/9.npy']
[Parallel(n_jobs=8)]: Using backend LokyBackend with 8 concurrent workers.
[Parallel(n_jobs=8)]: Done   6 out of  10 | elapsed:   10.4s remaining:    6.9s
[Parallel(n_jobs=8)]: Done  10 out of  10 | elapsed:   13.2s finished
['temp/0.npy', 'temp/1.npy', 'temp/2.npy', 'temp/3.npy', 'temp/4.npy', 'temp/5.npy', 'temp/6.npy', 'temp/7.npy', 'temp/8.npy', 'temp/9.npy']