У меня есть набор данных объемом 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 работает как шарм, слишком медленный, а распараллеливание - нет.