近一直在弄NEO4J ,在使用中也发现了一些问题,在数据导入中也遇到了一些问题。
在NEO4J中导入数据可以通过两种方法
1 通过系统LOAD CSV的方式
2 一次性导入数据和关系的方式
在使用中其实种方式比较灵活,可以导入增量数据可以merge数据,等等其实是一种比较好的方式,同时导入数据后,可以通过语句建立关系,方便后续的查询。
但实际上也遇到了一些问题,主要在于关系的建立上,由于有些数据量 一个100万的节点 和一个 200万的节点要进行一个关系的建立,发现非常慢,其实也是在这两个节点上建立的索引,但速度还是有点无法接受,并且由于是社区版本,语句执行中如果无响应时间比较长,目前也没有什么好的方式来进行停止和观测(可能学艺不精,如果有知道的还望不吝赐教)。
所以就引出了第二个问题,如何一次性的将历史数据和关系快速的导入到NOEO4J中。一次性导入数据就牵扯到几个点
1 数据的初始化,就需要牵扯节点的建立,属性以及label 的建立,并且可能一个NODE 不仅仅有一个 label
2 和LOAD CSV 的方式不一样,我们需要在数据整理的初期,就开始进行关系的数据的建立和数据的导入。在数据和关系一次性的导入后,系统就可以开始正常的工作。
3 对于数据量比较大的情况,又是历史数据的情况下,还是使用neo4j-admin import 比较适合。
说白了就是 灵活性 和 性能的速度之间的选择。
提到性能就需要对NEO4J 的一些性能指标以及初步的性能调优进行一些工作。
1 内存的设置不能高于整体系统的内存配置,由于通过JAVA 进行开发,则NEO4J 是建立在JAVA 虚拟机的基础上
考虑的问题
1 系统预留的内存,官网上给出的答案是预留1 G 给系统,但实际上这样做很危险,如果由于某些原因导致内存泄漏其他问题,则OOM的问题照样会发生在NEO4J,所以预留足够的内存给系统是重要的。具体看系统使用的情况3-5G。
2 索引和图数据,根据NEO4J的主要原理是要使用,dbms.memory.pagecache.size, 在保证heap 内存的使用的基础上,将其他的内存都放到pagecache.size中
3 HEAP SIZE
查询中的使用的内存,以及线程连接的内存都是由 HEAP 来支撑的,所以如果经常有大量的复杂查询以及连接的操作较多的情况下是需要大的HEAP SIZE的
假设我们对NEO4J的内存分配如下,则总体的内存应该 3-5G + 10G + 20G = 33-35G 总体配比个人理解,如果你连接的查询量小,但都是大查询,则可以考虑提高PAGE SIZE ,如果你的连接数量大,则需要调高你的HEAP.MAX_SIZE