Многопроцессорный пул не запускает функцию Astropy - PullRequest
0 голосов
/ 25 января 2019

У меня есть набор данных объемом 500 ГБ, и я хотел бы проанализировать его с помощью машинного обучения, требуя от меня извлечь все объекты, для которых параметр "phot_variable_flag" установлен в "VARIABLE". Набор данных разделен на ~ 1000 вложенных файлов, через которые мне нужно выполнить синтаксический анализ, и поэтому я хочу использовать многопроцессорную обработку для анализа нескольких файлов одновременно.

Я прочитал multiprocessing в Python с Pool и реализовал его, однако, застрял с определенной командой Astropy (Table.read()), которая не выполняется.

Я проверил код для следующего:

  • Входные данные правильно проанализированы и могут отображаться и проверяться с помощью print, показывая, что все загружено правильно
  • Простой цикл for, повторяющий весь входной файл и передающий каждое имя файла в функцию get_objects(), работает и выдает правильный вывод

Таким образом, работает очень простой непараллельный пример.

import sys
import multiprocessing as mp
from astropy.table import Table

def get_objects(file):
    print(file)
    data = Table.read(file)
    print("read data")
    rnd = data[data["phot_variable_flag"] == "VARIABLE"]
    del data
    rnd.write(filepath)
    del rnd

args = sys.argv[1:]

if __name__ == '__main__':

   files = args[0:]

   pool = mp.Pool(processes=12)

   [pool.apply_async(get_objects, args=(file,)) for file in files]

Запуск этого кода выдает 12 различных имен файлов, как и ожидалось (что означает, что Pool с 12 рабочими запущен ?!). Однако непосредственно после этого код заканчивается. Оператор "read data" print больше не выполняется, что означает, что вызов Table.read() завершился неудачей.

Однако я не получаю никаких сообщений об ошибках, и мой терминал возобновляет работу, как будто программа завершена правильно. Все это происходит во временном интервале, который делает невозможным выполнение функции Table.read(), поскольку чтение одного файла занимает ~ 2-3 минуты, но после печати имен файлов программа немедленно останавливается. Вот где я полностью застрял, поскольку цикл for работает как шарм, слишком медленный, а распараллеливание - нет.

...