spring - star - ¿Por qué la velocidad del inserto de neo4j es tan baja en este ejemplo?
spring project (1)
Una llamada a save()
es en realidad una solicitud de persitencia directa en contra de la base de datos. Actualmente no existe la noción de diferir las llamadas a save ().
Al activar el registro de consultas al agregar un archivo logback-test.xml
a sus recursos de prueba:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d %5p %40.40c:%4L - %m%n</pattern>
</encoder>
</appender>
<logger name="org.neo4j.ogm" level="info" />
<root level="info">
<appender-ref ref="console" />
</root>
</configuration>
Puedes ver que para cada Person.save()
realmente hará 3 solicitudes:
- 1 para guardar los objetos del coche
- 1 para guardar el objeto Persona
- 1 para crear las relaciones
-
2016-07-25 05:27:51,093 INFO drivers.embedded.request.EmbeddedRequest: 155 - Request: UNWIND {rows} as row CREATE (n:`Car`) SET n=row.props RETURN row.nodeRef as nodeRef, ID(n) as nodeId with params {rows=[{nodeRef=-590487524, props={type=f27dc1bac12a480}}, {nodeRef=-1760792732, props={type=41ff5d3a69b4a5b4}}, {nodeRef=-637840556, props={type=3e7e77ca5e406a21}}]}
2016-07-25 05:27:54,117 INFO drivers.embedded.request.EmbeddedRequest: 155 - Request: UNWIND {rows} as row CREATE (n:`Person`) SET n=row.props RETURN row.nodeRef as nodeRef, ID(n) as nodeId with params {rows=[{nodeRef=-1446435394, props={name=bafd7ad2721516f8}}]}
2016-07-25 05:27:54,178 INFO drivers.embedded.request.EmbeddedRequest: 155 - Request: UNWIND {rows} as row MATCH (startNode) WHERE ID(startNode) = row.startNodeId MATCH (endNode) WHERE ID(endNode) = row.endNodeId MERGE (startNode)-[rel:`HAS`]->(endNode) RETURN row.relRef as relRefId, ID(rel) as relId with params {rows=[{startNodeId=3, relRef=-712176789, endNodeId=0}, {startNodeId=3, relRef=-821487247, endNodeId=1}, {startNodeId=3, relRef=-31523689, endNodeId=2}]}
El rendimiento sería mejor si, en cambio, la declaración para la creación de la persona simplemente utilizara como parámetro las 100 personas a la vez, y lo mismo para los objetos del automóvil.
A partir de ahora no existe una función nativa lista para usar en el OGM (número abierto: https://github.com/neo4j/neo4j-ogm/issues/208
Sin embargo, puede agruparlos saving
una colección en lugar de uno por uno:
@Test
@DirtiesContext
public void speedTest2() {
SessionFactory sessionFactory = new SessionFactory("hello.neo.domain");
Session session = sessionFactory.openSession();
Random rand = new Random(10);
System.out.println("Before linking up with Neo4j...");
long start = System.currentTimeMillis();
long mark = start;
for (int j = 0; j < 10; j++) {
List<Person> batch = new ArrayList<>();
for (int i = 0; i < 100; i++) {
Person greg = new Person(rand);
batch.add(greg);
}
session.save(batch);
long now = System.currentTimeMillis();
System.out.format("%d : Time:%d/n", j, now - mark);
mark = now;
}
}
Puedes ver que la diferencia de resultados es muy impresionante:
Not initialzing DB.
Before linking up with Neo4j...
0 : Time:7318
1 : Time:1731
2 : Time:1555
3 : Time:1481
4 : Time:1237
5 : Time:1176
6 : Time:1101
7 : Time:1094
8 : Time:1114
9 : Time:1015
Not initialzing DB.
Before linking up with Neo4j...
0 : Time:494
1 : Time:272
2 : Time:230
3 : Time:442
4 : Time:320
5 : Time:247
6 : Time:284
7 : Time:288
8 : Time:366
9 : Time:222
Quería probar la velocidad de inserción con los últimos datos de primavera neo4j 4. Modifiqué el ejemplo de las películas para hacer las cosas simples y comparables.
Intenta ejecutar la clase de prueba: movies.spring.data.neo4j.repositories.PersonRepositoryTest aquí.
Se necesitan 5 segundos para agregar 400 nodos en este ejemplo. https://github.com/fodon/neo4j-spring-data-speed-demo
Esta es una prueba de velocidad con la versión anterior de neo4j https://github.com/fodon/gs-accessing-data-neo4j-speed
La clase hello.Application es aproximadamente 40 veces más rápida que spring-data-neo4j-4 para el mismo trabajo.
¿Por qué spring-data-neo4j-4 es más lento que la versión anterior? ¿Cómo se puede acelerar?