gpt4 book ai didi

java - neo4j 更新 1000 万个节点上的属性

转载 作者:行者123 更新时间:2023-12-01 11:03:20 25 4
gpt4 key购买 nike

我使用neo4j java core api并且想要更新1000万个节点。我认为使用多线程会更好,但性能不太好(设置属性需要 35 分钟)。

解释一下:每个节点“Person”至少有一个与“Point”节点的关系“POINTSREL”,该节点具有属性“Points”。我想总结“Point”节点中的点,并将其设置为“Person”节点的属性。

这是我的代码:

Transaction transaction = service.beginTx();
ResourceIterator<Node> iterator = service.findNodes(Labels.person);
transaction.success();
transaction.close();

ExecutorService executor = Executors.newFixedThreadPool(5);

while(iterator.hasNext()){
executor.execute(new MyJob(iterator.next()));
}

//wait until all threads are done
executor.shutdown();

try {
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}

这里是可运行类

private class MyJob implements Runnable {

private Node node;

/* collect useful parameters in the constructor */
public MyJob(Node node) {
this.node = node;
}

public void run() {
Transaction transaction = service.beginTx();
Iterable<org.neo4j.graphdb.Relationship> rel = this.node.getRelationships(RelationType.POINTSREL, Direction.OUTGOING);

double sum = 0;
for(org.neo4j.graphdb.Relationship entry : rel){
try{
sum += (Double)entry.getEndNode().getProperty("Points");
} catch(Exception e){
e.printStackTrace();
}
}
this.node.setProperty("Sum", sum);

transaction.success();
transaction.close();
}
}

有更好(更快)的方法吗?

关于我的设置:具有 8 个 CPU 和 32GB RAM 的 AWS 实例

neo4j-wrapper.conf

# Java Heap Size: by default the Java heap size is dynamically
# calculated based on available system resources.
# Uncomment these lines to set specific initial and maximum
# heap size in MB.
wrapper.java.initmemory=16000
wrapper.java.maxmemory=16000

neo4j.properties

# The type of cache to use for nodes and relationships.
cache_type=soft
cache.memory_ratio=30.0
neostore.nodestore.db.mapped_memory=2G
neostore.relationshipstore.db.mapped_memory=7G
neostore.propertystore.db.mapped_memory=2G
neostore.propertystore.db.strings.mapped_memory=2G
neostore.propertystore.db.arrays.mapped_memory=512M

最佳答案

从我的角度来看,还有一些可以改进的地方。

题外话

如果您使用的是 Java 7(或更高版本),请考虑使用 try with resource到处理程序事务。它将防止您犯错误。

性能

首先 - 批处理。目前您是:

  • 创建工作
  • 启动线程(实际上执行器中有pool)
  • 开始交易

对于每个节点。您应该考虑批量进行更新。这意味着您应该:

  • 收集 N 个节点(即 N=1000)
  • N 个节点创建单个作业
  • 在作业中创建单个事务
  • 更新该事务中的 N 个节点
  • 关闭交易

设置

您有 8 个 CPU。这意味着您可以创建更大的线程池。我认为 Executors.newFixedThreadPool(16) 就可以了。

黑客

您有 32GB 内存。我可以建议:

  • 将 Java 堆大小减少到 8GB。根据我的经验,较大的堆大小可能会导致大量 GC 暂停和性能下降
  • 增加映射内存大小。只是为了确保更多数据可以保存在缓存中。

仅针对您的情况。如果您的所有数据都可以放入 RAM,那么您可以将 cache_type 更改为 hard 以实现此更改目的。 Details .

配置

正如您所说 - 您正在使用核心 API。这是嵌入式图形数据库还是服务器扩展

如果这是嵌入式图形数据库 - 您应该验证您的数据库设置是否应用于创建的实例。

关于java - neo4j 更新 1000 万个节点上的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33163622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com