Ошибка ввода-вывода Fedora и ошибка 111 при многопроцессорной обработке Python
У меня есть коллекция в mongodb 4.0.2
, Я читаю эти документы через итерацию в python 2.7
извлекая из них информацию и записывая ее в виде узлов и связей в neo4j 3.4.6
, на моем fedora 26
машина.
Вот несколько метрик. Коллекция монго насчитывает около 70000 документов. Ожидается, что это создаст около 1200 узлов в neo4j и 20 000 связей. Поскольку обработка данных в python(второй шаг в последовательности mongo -> python -> neo4j) занимает некоторое время, я использую python multiprocessing
чтобы сделать задачу быстрее. я использовал 2*cpu_count()
количество процессов. Так как у меня машина четырехъядерная, начинается 8 процессов. Процессы разделяются в пуле, сначала разбивая 70000 документов монго на 8 вложенных документов, а затем обрабатывая каждый вложенный документ параллельно в каждом из 8 процессов. Между каждым запросом neo4j я установил интервал в 100 мс. dbms transaction timeout
в neo4j установлен на 3 минуты.
Проблема, с которой я сталкиваюсь, заключается в том, что через некоторое время Fedora начинает выдавать ошибку ввода-вывода и не принимает никакого взаимодействия с терминалом. База данных neo4j становится недоступной, и дальнейшая запись останавливается. Наконец, ошибка 111, ошибка соединения отклоняется на каждой итерации. Я должен принудительно выключить компьютер. Что такое многопроцессорная оптимизация, которая мне не хватает, которая должна это исправить?
В качестве альтернативного подхода я могу преобразовать монго-документы в CSV и использовать APOC для быстрого построения графика с использованием CSV, но я хочу понять, какие упущения оптимизации мне не хватает, что создает проблемы при первом подходе.