如何提高 Neo4j 的性能?
How to increase performance in neo4j?
我用的是嵌入式neo4j 1.9.3
,会有
- 节点:3亿
- 关系:6亿
- 每个节点的属性:1
- 每个关系的属性:1
我的机器有:
- 内存:8GB
- 硬盘:1TB
- CPU:2.20 GHz
我的配置是:
- -Xms4g
- -Xmx6g
- -XX:+UseG1GC
- dbms.pagecache.memory = 4g
- -XX:+UseG1GC
我正在使用 Java API 进行写入和查询操作。查询速度还不错,但是写入速度很慢。会是什么原因呢?我应该添加哪些配置以提高写入速度?
这是我代码中的写法部分:
private static IndexManager index = Graph.graphDB.index();
private static Index<Node> allNodes = index.forNodes("allnodes");
public Node create(String value) {
Node node = super.getOrCreate("name", value);
return node;
}
public void createNode() {
try {
Transaction tx = Graph.graphDB.beginTx();
Node subject = create(RDF.getInstance().getSubject().toString());
Node object = create(RDF.getInstance().getObject().toString());
Node predicate = create(RDF.getInstance().getPredicate().toString());
Node factNode = Graph.graphDB.createNode();
factNode.createRelationshipTo(subject, RelTypes.SUBJECT);
factNode.createRelationshipTo(predicate, RelTypes.PREDICATE);
factNode.createRelationshipTo(object, RelTypes.OBJECT);
allNodes.add(subject, "name", subject.getProperty("name"));
allNodes.add(predicate, "name", predicate.getProperty("name"));
allNodes.add(object, "name", object.getProperty("name"));
tx.success();
} catch (Exception e) {
e.printStackTrace();
}
}
您忘记了tx.finish()
,所以您的交易永远不会closed/comitted。
可能是你的磁盘太慢了。使用固态硬盘。
确保禁用病毒扫描程序/磁盘加密。
拥有更多可用内存也很有意义,例如16G.
目前您可能交换到磁盘,因为您在 8G 机器上使用 4+6G = 10G。
将堆内存减少到 2G,页面缓存减少到 5G。所以你有 1G 用于 OS 和 JVM。
一般来说,将 RDF 模型存储在 属性 图中没有多大意义。
尝试创建一个合适的 属性 图形模型并将 导入其中 。
另外我建议升级到最新版本的Neo4j 2.3.1。
或者您的代码效率不高,尤其是。这些行:
Node subject = create(RDF.getInstance().getSubject().toString());
Node object = create(RDF.getInstance().getObject().toString());
Node predicate = create(RDF.getInstance().getPredicate().toString());
allNodes.add(subject, "name", subject.getProperty("name"));
allNodes.add(predicate, "name", predicate.getProperty("name"));
allNodes.add(object, "name", object.getProperty("name"));
将所有内容添加到索引中是否有意义?为什么?
您还应该有更高效的代码来访问属性,为什么要先将其从 RFD 中拉出,然后再将其从 属性 中拉出?
将值存储在变量中。
我用的是嵌入式neo4j 1.9.3
,会有
- 节点:3亿
- 关系:6亿
- 每个节点的属性:1
- 每个关系的属性:1
我的机器有:
- 内存:8GB
- 硬盘:1TB
- CPU:2.20 GHz
我的配置是:
- -Xms4g
- -Xmx6g
- -XX:+UseG1GC
- dbms.pagecache.memory = 4g
- -XX:+UseG1GC
我正在使用 Java API 进行写入和查询操作。查询速度还不错,但是写入速度很慢。会是什么原因呢?我应该添加哪些配置以提高写入速度?
这是我代码中的写法部分:
private static IndexManager index = Graph.graphDB.index();
private static Index<Node> allNodes = index.forNodes("allnodes");
public Node create(String value) {
Node node = super.getOrCreate("name", value);
return node;
}
public void createNode() {
try {
Transaction tx = Graph.graphDB.beginTx();
Node subject = create(RDF.getInstance().getSubject().toString());
Node object = create(RDF.getInstance().getObject().toString());
Node predicate = create(RDF.getInstance().getPredicate().toString());
Node factNode = Graph.graphDB.createNode();
factNode.createRelationshipTo(subject, RelTypes.SUBJECT);
factNode.createRelationshipTo(predicate, RelTypes.PREDICATE);
factNode.createRelationshipTo(object, RelTypes.OBJECT);
allNodes.add(subject, "name", subject.getProperty("name"));
allNodes.add(predicate, "name", predicate.getProperty("name"));
allNodes.add(object, "name", object.getProperty("name"));
tx.success();
} catch (Exception e) {
e.printStackTrace();
}
}
您忘记了tx.finish()
,所以您的交易永远不会closed/comitted。
可能是你的磁盘太慢了。使用固态硬盘。 确保禁用病毒扫描程序/磁盘加密。
拥有更多可用内存也很有意义,例如16G.
目前您可能交换到磁盘,因为您在 8G 机器上使用 4+6G = 10G。 将堆内存减少到 2G,页面缓存减少到 5G。所以你有 1G 用于 OS 和 JVM。
一般来说,将 RDF 模型存储在 属性 图中没有多大意义。 尝试创建一个合适的 属性 图形模型并将 导入其中 。
另外我建议升级到最新版本的Neo4j 2.3.1。
或者您的代码效率不高,尤其是。这些行:
Node subject = create(RDF.getInstance().getSubject().toString());
Node object = create(RDF.getInstance().getObject().toString());
Node predicate = create(RDF.getInstance().getPredicate().toString());
allNodes.add(subject, "name", subject.getProperty("name"));
allNodes.add(predicate, "name", predicate.getProperty("name"));
allNodes.add(object, "name", object.getProperty("name"));
将所有内容添加到索引中是否有意义?为什么?
您还应该有更高效的代码来访问属性,为什么要先将其从 RFD 中拉出,然后再将其从 属性 中拉出? 将值存储在变量中。