当我在Neo4j中使用多线程查询时,如何避免ReentrantLock

时间:2013-09-30 02:40:00

标签: multithreading caching locking neo4j

我创建了一个包含100万个节点和1亿个关系的图表。我只有16 GB RAM,无法缓存所有节点和关系对象。我选择gcr cache_type并通过遍历节点和关系来预热图形。 我的机器有16核CPU。问题是单个线程的一个查询的性能是好的(30毫秒)。但是多线程的性能下降很多,例如,一个查询的平均成本大约是100毫秒,有4个线程。我发现NodeManager.lockId()占用了大部分时间。 NodeManager的源代码在这里:

http://grepcode.com/file/repo1.maven.org/maven2/org.neo4j/neo4j-kernel/1.9.2/org/neo4j/kernel/impl/core/NodeManager.java?av=f

当我们得到一个节点或关系时,它会尝试做一些事情来缓存它们,这会生成一个ReentrantLock并阻塞线程。

我不知道如何避免锁定或做其他事情以减少开销。我想提高多线程的性能。提前谢谢!

1 个答案:

答案 0 :(得分:0)

仅供参考我想请注意,您所指的锁定将不会存在于2.0中,其中2.0-M06将是第一个具有此功能的里程碑。