Хобрук: Ваш путь к мастерству в программировании

Лучший способ импортировать объемные данные в ArangoDB

В настоящее время я работаю над ArangoDB POC. Я обнаружил, что время, затрачиваемое на создание документа в ArangoDB с PyArango, очень велико. Вставка 300 документов занимает около 5 минут. Я вставил примерный код ниже, пожалуйста, дайте мне знать, если есть лучшие способы ускорить это:

with open('abc.csv') as fp:
for line in fp:
    dataList = line.split(",")

    aaa = dbObj['aaa'].createDocument()
    bbb = dbObj['bbb'].createDocument() 
    ccc = dbObj['ccc'].createEdge()

    bbb['bbb'] = dataList[1]
    aaa['aaa'] = dataList[0]
    aaa._key = dataList[0]

    aaa.save()
    bbb.save()

    ccc.links(aaa,bbb)
    ccc['related_to'] = "gfdgf"
    ccc['weight'] = 0

    ccc.save()

Различные коллекции создаются с помощью приведенного ниже кода:

 dbObj.createCollection(className='aaa', waitForSync=False)
16.08.2016

  • Рассматривали ли вы arangoimp? При необходимости вы можете предварительно обработать исходные данные с помощью Python, но сам импорт должен выполняться arangoimp, который для эффективности использует API массового импорта ArangoDB. 17.08.2016
  • Заглянул в арангоимп, похоже данные должны быть в виде файлов JSON, CSV с уже присутствующими первичными ключами. Проблема, которую я вижу здесь, заключается в том, что я не смогу обрабатывать повторяющиеся узлы, которые могут уже присутствовать в БД. Существуют ли какие-либо конкретные параметры для обработки этих условий, я не смог найти их в документации ArangoImp. 18.08.2016
  • В настоящее время у pyArango есть проблема с HTTP keep-alive — он не будет повторно использовать соединения и, следовательно, в конечном итоге повторно выполнять поиск DNS. В настоящее время мы выясняем, что может быть причиной этого и как это исправить. 18.08.2016
  • @dothebart: Спасибо за информацию. Недавно я пробовал использовать java-драйвер для ArangoDB, при включенном пакетном режиме он передавал данные со скоростью около 1000 документов в секунду, однако в нем не обновляются пограничные коллекции. Тот же код обновил коллекции Edge после того, как я удалил пакетный режим. Пожалуйста, дайте мне знать, если у вас есть какие-либо идеи по этому поводу. 18.08.2016
  • @pjesudhas: arangoimp поддерживает JSON, CSV и TSV. Ключ документа не обязательно должен присутствовать. Если вы его не укажете, ArangoDB сгенерирует для вас ключ. Конечно, вам нужны атрибуты _from и _to для ребер, чтобы указать, какие документы нужно связать. Это делается с помощью идентификаторов документов (_id, имя коллекции + / + ключ документа). Документы, которые вы хотите связать, на самом деле не должны существовать, должна присутствовать только коллекция. О том, как обращаться с дубликатами документов, см. здесь: документы. arangodb.com/3.0/Руководство/Администрирование/ 18.08.2016
  • @CoDEmanX: Спасибо за информацию, я буду следовать этой процедуре. 18.08.2016
  • тем временем pyArango был исправлен - теперь он снова будет успешно использовать HTTP-соединение. 22.08.2016

Ответы:


1

для вашей проблемы с пакетным режимом в java-драйвере arango. если вы знаете ключевые атрибуты вершин, вы можете создать дескриптор документа с помощью «коллекцииИмя» + «/» + «documentKey». Пример:

arangoDriver.startBatchMode();

for(String line : lines)
{
  String[] data = line.split(",");

  BaseDocument device = new BaseDocument();
  BaseDocument phyAddress = new BaseDocument(); 
  BaseDocument conn = new BaseDocument();

  String keyDevice = data[0];
  String handleDevice = "DeviceId/" + keyDevice; 

  device.setDocumentKey(keyDevice);

  device.addAttribute("device_id",data[0]);

  String keyPhyAddress = data[1];
  String handlePhyAddress = "PhysicalLocation/" + keyPhyAddress; 

  phyAddress.setDocumentKey(keyPhyAddress);

  phyAddress.addAttribute("address",data[1]);

  final DocumentEntity<BaseDocument> from = arangoDriver.graphCreateVertex("testGraph", "DeviceId", device, null);       
  final DocumentEntity<BaseDocument> to = arangoDriver.graphCreateVertex("testGraph", "PhysicalLocation", phyAddress, null);

  arangoDriver.graphCreateEdge("testGraph", "DeviceId_PhysicalLocation", null, handleDevice, handlePhyAddress, null, null);

}
arangoDriver.executeBatch();
18.08.2016

2

Я бы создал все данные для вставки в строку в формате json и использовал createDocumentRaw для их одновременного создания с одним сохранением.

16.08.2016
Новые материалы

Аргументы прогрессивного улучшения почти всегда упускают суть
В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

Введение в Джанго Фреймворк
Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

стройный-i18следующий
Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..

Обзор 20 основных и современных методов работы с массивами в JavaScript
Вы знаете их всех? В этом коротком посте я покажу сводку методов, доступных в JavaScript для работы с массивами. Я надеюсь, что вы найдете это полезным! В конце поста вы найдете ссылку на..

Да, но я чувствую необходимость указать, что это или не единственные два.
Да, но я чувствую необходимость указать, что это или не единственные два. Обучение с подкреплением (в качестве примера) также является важным.