Я попытался прочитать MIDI
файлы и добавить заметки в список с многопроцессорной обработкой pool.map()
, поскольку существуют тысячи MIDI
файлов.Я разрабатываю проект с использованием классов Python следующим образом.
class NoteProcessor:
def __init__(self):
self.note_sequences = list()
self.notes = set()
.....
def process_midi(self, df):
PATH_ROOT = 'clean_midi/'
for row in tqdm(df.itertuples(), total=df.shape[0]):
notes = set()
path = PATH_ROOT + row.path + '/' + row.song + '.mid'
try:
midi = converter.parse(path)
elements = instrument.partitionByInstrument(midi)
encoded_notes = self.arrange_notes(elements)
if len(encoded_notes) != 0:
#self.note_sequences should be shared array
self.note_sequences.append(encoded_notes)
else:
self.df = self.df.drop(row[0])
except Exception as e:
self.df = self.df.drop(row[0])
logging.error("MIDI Error " + str(e))
основной скрипт:
if __name__ == '__main__':
df = read_csv()
note_p = NoteProcessor(df)
num_processes = cpu_count()
chunk_size = int(df.shape[0] / num_processes)
chunks = [df.ix[df.index[i:i + chunk_size]] for i in range(0, df.shape[0], chunk_size)]
pool = Pool()
pool.map(note_p.process_midi, chunks)
Поскольку note_sequences
не является общим массивом, он бесполезен.Я исследовал многопроцессорный массив Python и нашел несколько ответов answer1 answer2 .Но я запутался с разделяемым массивом в качестве атрибута класса, и ошибка RuntimeError: SynchronizedArray objects should only be shared between processes through inheritance
выдает, когда я заменяю self.note_sequences = list()
на self.note_sequences = multiprocessing.Array(c_char_p,df.shape[0])
.Как это решить?