Многопроцессорная обработка и вставка / обновление Neo4J через py2neo - PullRequest
0 голосов
/ 22 января 2020

Я работаю над проектом, который требует быстрого воспроизведения большого количества информации в Neo4J через py2neo, и я столкнулся с проблемой при попытке использовать многопроцессорную библиотеку Python для ускорения процесса.

В общих чертах, то, что мы делаем, состоит из двух частей, где обе части происходят в унисон:

Часть 1:

  • Создание отношений между парой узлов (A-> B)
  • Создание другого узла, который имеет одно отношение к каждой из предыдущей пары (C -> A, C -> B)
  • Pu sh все 3 узла и их связи в Neo4j,
  • Pu sh идентификатор узла C к топике кафки c

Часть 2:

  • Создание N "потоков" с помощью многопроцессорной обработки python, все из которых открывают своего собственного потребителя kafka
  • потребители читают topi c и выполняют код, который может обновлять отношения / узлы или создайте дополнительные.

Возникающая проблема возникает во второй части, особенно при обновлении или создании связей или узлов. py2neo выдает py2neo.database.TransientError, что в соответствии с документацией:

База данных не может обработать запрос прямо сейчас, повторная попытка позже может привести к успешному результату.

Я попытался добавить проверку безопасности, которая будет повторять транзакцию X раз, и повторно отправлять sh ее в kafka topi c, чтобы другой поток мог попытаться выполнить ее после неудачных попыток, но конечные результаты все еще неверны .

Я ужасно неосведомлен, когда дело доходит до многопоточности / многопроцессорности, поэтому я чувствую, что мои первоначальные исследовательские усилия были совершенно неосновными, и я потратил много циклов, пытаясь это исправить - - Любое направление или понимание очень ценится.

Может предоставить дополнительную информацию, если это необходимо - не уверен, что мне не хватает.

Спасибо

1 Ответ

0 голосов
/ 23 января 2020

Я думаю, что проблема в том, что вы пытаетесь писать в узлы / отношения, которые заблокированы другими запросами. Это не зависит от py2neo, и вы должны столкнуться с подобными проблемами при выполнении параллельной записи с другой библиотекой / фреймворком. См. Здесь: https://neo4j.com/docs/java-reference/4.0/transaction-management/locking/

Ошибка py2neo и документы в этом случае не сильно помогают.

Повторные попытки X могут работать для небольших рабочих нагрузок, где можно ожидать напишите замки, которые будут выпущены быстро. Однако, если вы постоянно пишете в одни и те же части графика, вы не можете предсказать поведение. Некоторые записи могут застрять в l oop навсегда.

Возможные решения

  • разделить задачи чтения / записи и иметь только один процесс записи в Neo4j
  • предварительная обработка данных, позволяющая избежать параллельной записи в заблокированные узлы
...