У меня есть коллекция в mongodb 4.0.2
. Я читаю эти документы с помощью итерации в python 2.7
, извлекаю из них информацию и записываю информацию в виде узлов и связей в neo4j 3.4.6
на моем fedora 26
компьютере.
Вот некоторые показатели. Коллекция монго насчитывает около 70 000 документов. Ожидается, что это создаст около 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, но я хочу понять, какие упущения оптимизации мне не хватает, что создает проблемы в первом подходе.