Раздавать многопроцессорный массив python как атрибут экземпляра объекта? - PullRequest
0 голосов
/ 31 марта 2019

Я попытался прочитать 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]).Как это решить?

...