как распечатать логи и измерить время выполнения - PullRequest
0 голосов
/ 16 марта 2020

В настоящее время я пытаюсь импортировать файл CSV, который содержит около 2 миллионов строк. Каждая строка соответствует узлу. Я использую браузер neo4j. примечание: я также попробовал инструмент импорта neo4j , но он также как-то работает медленнее.

Я попытался запустить скрипт со стандартным запросом шифра, например

USING PERIODIC COMMIT 500 LOAD CSV FROM 'file:///data.csv' AS r 
WITH toInteger(r[0]) AS ID, toInteger(r[1]) AS national_id, toInteger(r[2]) as passport_no, toInteger(r[3]) as status, toInteger(r[4]) as activation_date 
MERGE (p:Customer {ID: ID}) SET p.national_id = national_id, p.passport_no = passport_no, p.status = status, p.activation_date = activation_date

Это работает очень медленно.

Позже я попробовал.

CALL apoc.periodic.iterate('CALL apoc.load.csv(\'file:/data.csv\') yield list as r return r','WITH toInteger(r[0]) AS ID, toInteger(r[1]) AS national_id, toInteger(r[2]) as passport_no, toInteger(r[3]) as status, toInteger(r[4]) as activation_date MERGE (p:Customer {ID: ID}) SET p.national_id = national_id, p.passport_no = passport_no, p.status = status, p.activation_date = activation_date',
{batchSize:10000, iterateList:true, parallel:true});

Похоже, что он работает быстрее, поскольку опция parallel - true. НО Я хочу измерить время выполнения одного пакета.

Как можно распечатать что-нибудь в браузере neo4j?

Как можно измерить время выполнения для одна партия ?

Ответы [ 2 ]

1 голос
/ 16 марта 2020
  1. В первом запросе используется размер пакета 500, а во втором - размер пакета, который в 20 раз больше. Для правильного сравнения необходимо использовать один и тот же размер пакета.

  2. Поскольку для вашего запроса требуется большое количество пакетов (не менее 200), разделив общее время на количество пакетов должно быть разумным приближением среднего времени на партию.

  3. Вы создали index для :Customer(ID)? Это должно помочь ускорить ваши запросы.

  4. Вы должны подумать, следует ли использовать выражение ON CREATE с предложением MERGE. Прямо сейчас, предложение SET всегда выполняется, даже если узел уже существует.

0 голосов
/ 17 марта 2020

Ключевым моментом является добавление «уникального ограничения» перед добавлением каких-либо данных. Это делает процесс намного быстрее. Я вижу, что из https://neo4j.com/docs/getting-started/current/cypher-intro/load-csv/ suggests constraints Теперь такой скрипт

CREATE CONSTRAINT ON (n:Movie) ASSERT n.no IS UNIQUE;
USING PERIODIC COMMIT 10000
LOAD CSV FROM 'file:///data/MovieData.csv' AS r
WITH r[0] AS no, toInteger(r[1]) AS status, toInteger(r[2]) as activation_date
MERGE (p:Movie {no: no})
ON CREATE SET p.status = status, p.activation_date = activation_date

добавляет 1 миллион узлов за 1 минуту. До этого было больше 2-3 дней.

...