Я долго искал, но не вижу никакой реализации методов извлечения музыкальных функций (таких как спектральный центроид , спектральная полоса пропускания и т. Д.), Интегрированных с 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 для этого процесса, но также не смог реализовать это.Может ли кто-нибудь помочь мне понять, что я делаю неправильно?