我创建了一个由 100 万个节点和 1 亿个关系组成的图。我只有 16 GB RAM,无法缓存所有节点和关系对象。我选择 gcr cache_type 并通过遍历节点和关系来预热图表。我的机器有 16 核 CPU。问题是单线程一次查询的性能很好(30毫秒)。但是多线程的性能下降很多,例如,一个查询的平均成本约为 100 毫秒,4 线程。我发现 NodeManager.lockId() 占用了大部分时间。NodeManager 的源码在这里:
似乎当我们得到一个节点或关系时,它会尝试做一些事情来缓存它们,这会生成一个 ReentrantLock 并阻塞线程。
我不知道如何避免锁定或做其他事情来减少开销。我想提高多线程的性能。提前致谢!