我一直在搜索很长时间,但看不到任何与 Apache Spark 集成的音乐特征提取技术(如频谱质心、频谱带宽等)的实现。我正在使用这些特征提取技术,这个过程需要很多时间来制作音乐。我想通过使用 Spark 来并行化和加速这个过程。我做了一些工作,但无法加快速度。我想得到光谱质心法的算术平均值和标准差。这是我到目前为止所做的。
from pyspark import SparkContext
import librosa
import numpy as np
import time
parts=4
print("Parts: ", parts)
sc = SparkContext('local['+str(parts)+']', 'pyspark tutorial')
def spectral(iterator):
l=list(iterator)
cent=librosa.feature.spectral_centroid(np.array(l), hop_length=256)
ort=np.average(cent)
std=np.std(cent)
return (ort, std)
y, sr=librosa.load("classical.00080.au") #This loads the song.
start1=time.time()
normal=librosa.feature.spectral_centroid(np.array(y), hop_length=256) #This is normal technique without spark
end1=time.time()
print("\nOrt: \t", np.average(normal))
print("Std: \t", np.std(normal))
print("Time elapsed: %.5f" % (end1-start1))
#This is where my spark implementation appears.
rdd = sc.parallelize(y)
start2=time.time()
result=rdd.mapPartitions(spectral).collect()
end2=time.time()
result=np.array(result)
total_avg, total_std = 0, 0
for i in range(0, parts*2, 2):
total_avg += result[i]
total_std += result[i+1]
spark_avg = total_avg/parts
spark_std = total_std/parts
print("\nOrt:", spark_avg)
print("Std:", spark_std)
print("Time elapsed: %.5f" % (end2-start2))
程序的输出如下。
Ort: 971.8843380584146
Std: 306.75410601230413
Time elapsed: 0.17665
Ort: 971.3152955225721
Std: 207.6510740703993
Time elapsed: 4.58174
所以,即使我并行化了数组 y(音乐信号数组),我也无法加快这个过程。这需要更长的时间。我不明白为什么。我是 Spark 概念的新手。我想在这个过程中使用 GPU,但也无法实现。谁能帮我理解我做错了什么?