我一直在玩JVM的堆大小和Neo4j中的文件存储缓存大小。似乎设置由OS处理的内存映射缓冲区对系统没有任何影响。
我尝试使用一个小型缓存来设置JVM堆非常大,并且它与缓存很大时一样快。
所以我的问题是:如何配置系统以允许我控制缓存?这是批处理的一个问题,因为它说它使用JVM堆?
我使用以下python脚本来填充数据库
neo4j.GraphDatabaseService("http://localhost:7474/db/data/")
f = open('indexslowdown_exp.txt','w')
f.write("Properties\t,\tSpeed\n")
total_time = timedelta(0)
name = 0
for y in range(0,1000):
batch = neo4j.WriteBatch(graph_db)
for x in range(0,100):
batch.create({"name":name})
name += 1
for x in range(0,100):
rand_node_A = random.randint(0,name-1)
rand_node_B = random.randint(0,name-1)
batch.append_cypher("START n=node("+str(rand_node_A)+"), m=node("+str(rand_node_B)+") CREATE (n)-[r:CONNECTED]->(m)")
start_time = datetime.now()
batch.submit()
end_time = datetime.now()
total_time = (end_time-start_time)
f.write(str(name)+" , "+str((total_time)/200)+"\n")
print "Inserting nodes: " + str(total_time)
f.close()
Neo4j.properties文件:
use_memory_mapped_buffers=true
/# Default values for the low-level graph engine
neostore.nodestore.db.mapped_memory=1k
neostore.relationshipstore.db.mapped_memory=1k
neostore.propertystore.db.mapped_memory=2k
neostore.propertystore.db.strings.mapped_memory=1k
neostore.propertystore.db.arrays.mapped_memory=1k
# Enable this to be able to upgrade a store from an older version
#allow_store_upgrade=true
# Enable this to specify a parser other than the default one.
#cypher_parser_version=2.0
# Keep logical logs, helps debugging but uses more disk space, enabled for
# legacy reasons To limit space needed to store historical logs use values such
# as: "7 days" or "100M size" instead of "true"
keep_logical_logs=true
# Autoindexing
# Enable auto-indexing for nodes, default is false
#node_auto_indexing=true
# The node property keys to be auto-indexed, if enabled
#node_keys_indexable=name,age
# Enable auto-indexing for relationships, default is false
#relationship_auto_indexing=true
# The relationship property keys to be auto-indexed, if enabled
#relationship_keys_indexable=name,age
的Neo4j-包装
wrapper.java.additional=-Dorg.neo4j.server.properties=conf/neo4j-server.properties
wrapper.java.additional=-Djava.util.logging.config.file=conf/logging.properties
wrapper.java.additional=-Dlog4j.configuration=file:conf/log4j.properties
#********************************************************************
# JVM Parameters
#********************************************************************
wrapper.java.additional=-XX:+UseConcMarkSweepGC
wrapper.java.additional=-XX:+CMSClassUnloadingEnabled
# Uncomment the following lines to enable garbage collection logging
wrapper.java.additional=-Xloggc:data/log/neo4j-gc.log
wrapper.java.additional=-XX:+PrintGCDetails
wrapper.java.additional=-XX:+PrintGCDateStamps
wrapper.java.additional=-XX:+PrintGCApplicationStoppedTime
wrapper.java.additional=-XX:+PrintTenuringDistribution
# Initial Java Heap Size (in MB)
wrapper.java.initmemory=200
# Maximum Java Heap Size (in MB)
wrapper.java.maxmemory=400
#********************************************************************
# Wrapper settings
#********************************************************************
# Override default pidfile and lockfile
#wrapper.pidfile=../data/neo4j-server.pid
#wrapper.lockfile=../data/neo4j-server.lck
#********************************************************************
# Wrapper Windows NT/2000/XP Service Properties
#********************************************************************
# WARNING - Do not modify any of these properties when an application
# using this configuration file has been installed as a service.
# Please uninstall the service before modifying this section. The
# service can then be reinstalled.
# Name of the service
wrapper.name=neo4j
# User account to be used for linux installs. Will default to current
# user if not set.
wrapper.user=
答案 0 :(得分:1)
你最关心的是什么?批量插入性能?如果是这样,如果您可以将整个图形放入内存中,MMIO将是最有效的,因此如果您可以估计节点和关系的数量,则可以粗略计算这两个商店所需的大小。
另外,如果您只想插入基元,则可以估计所需的属性存储的大小。如果您要存储字符串和数组(较大类型),您也可以增加这两个商店的MMIO设置,但如果您不需要它们,请将它们设置为低。
约节点存储的大小:节点数* 14个字节(如果您使用最新的Neo4j;如果Neo4j <2.0则为9个字节)
约关系存储的大小:rels的数量* 33个字节
请记住:磁盘上的存储大小与文件系统缓存的内存之间的距离接近1:1。
同样,更大的JVM堆并不一定意味着更高的性能;实际上,MMIO大小(取决于您设置use_memory_mapped_buffers的值)可能位于JVM堆之外。无论如何,大型JVM堆还会引入更长的GC暂停和其他与GC相关的问题,因此不要太大。
HTH
答案 1 :(得分:0)
您使用的操作系统是什么?你可以分享你的配置和graph.db / messages.log吗?
您的疑问: