我一直在搜索很长时间,但无法看到与Apache Spark集成的音乐特征提取技术(如spectral centroid,spectral bandwidth等)的任何实现。我正在使用这些特征提取技术,这个过程需要花费大量时间来播放音乐。我想通过使用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,但也无法实现。谁能帮我理解我做错了什么?