我正在使用AWS dynamoDB本地实现的titan 1.0作为16GB机器上的存储后端。我的用例涉及生成周期性包含顶点和图形的图形。边缘大约120K。每当我在内存中生成一个新图形时,我会检查存储在DB中的图形,并且(i)添加不存在的顶点/边缘,或者(ii)更新属性(如果它们已经存在)(存在由&#39确定) ;标签'和'价值'属性)。请注意“价值”'财产已编入索引。事务以500个顶点批量提交。
问题:我发现每次处理新图表时此过程都会变慢(第一张图表最初在45分钟内完成,最初为空数据库,第二张图表耗时2.5小时,第三张图片耗时3.5小时,第4张6小时,10小时5分等等)。实际上,在处理给定图形时,它在启动时相当快,但逐渐变慢(初始批次需要2-4秒,之后对于相同批量大小的500个节点,它会增加到100秒;我有时也会看到它一批需要1000-2000秒。这仅是处理时间(见下面的方法);提交总是需要8-10秒。我将jvm堆大小配置为10G,我注意到当应用程序运行时,它最终会耗尽所有这些。
问题:这种行为是否可以预料到?在我看来这里有些问题(在我的config /方法中?)。任何帮助或建议将不胜感激。
方法:
对于每个子节点,我检查它是否存在于DB中,否则创建新节点,并更新一些属性
Vertex dbVertex = dbgraph.traversal().V()
.has(currentVertexInMem.label(), "Value",
(String) currentVertexInMem.value("Value"))
.tryNext()
.orElseGet(() -> createVertex(dbgraph, currentVertexInMem));
if (dbVertex != null) {
// Update Properties
updateVertexProperties(dbgraph, currentVertexInMem, dbVertex);
}
// Add edge if necessary
if (parentDBVertex != null) {
GraphTraversal<Vertex, Edge> edgeIt = graph.traversal().V(parentDBVertex).outE()
.has("EdgeProperty1", eProperty1) // eProperty1 is String input parameter
.has("EdgeProperty2", eProperty2); // eProperty2 is Long input parameter
Boolean doCreateEdge = true;
Edge e = null;
while (edgeIt.hasNext()) {
e = edgeIt.next();
if (e.inVertex().equals(dbVertex)) {
doCreateEdge = false;
break;
}
if (doCreateEdge) {
e = parentDBVertex.addEdge("EdgeLabel", dbVertex, "EdgeProperty1", eProperty1, "EdgeProperty2", eProperty2);
}
e = null;
it = null;
}
...
if ((processedVertexCount.get() % 500 == 0)
|| processedVertexCount.get() == verticesToProcess.get()) {
graph.tx().commit();
}
创建功能:
public static Vertex createVertex(Graph graph, Vertex clientVertex) {
Vertex newVertex = null;
switch (clientVertex.label()) {
case "Label 1":
newVertex = graph.addVertex(T.label, clientVertex.label(), "Value",
clientVertex.value("Value"),
"Property1-1", clientVertex.value("Property1-1"),
"Property1-2", clientVertex.value("Property1-2"));
break;
case "Label 2":
newVertex = graph.addVertex(T.label, clientVertex.label(), "Value",
clientVertex.value("Value"), "Property2-1",
clientVertex.value("Property2-1"),
"Property2-2", clientVertex.value("Property2-2"));
break;
default:
newVertex = graph.addVertex(T.label, clientVertex.label(), "Value",
clientVertex.value("Value"));
break;
}
return newVertex;
}
架构默认:(显示部分索引)
注意:
&#34; EdgeLabel&#34; = Constants.EdgeLabels.Uses
&#34; EdgeProperty1&#34; = Constants.EdgePropertyKeys.EndpointId
&#34; EdgeProperty2&#34; = Constants.EdgePropertyKeys.Timestamp
public void createSchema() {
// Create Schema
TitanManagement mgmt = dbgraph.openManagement();
mgmt.set("cache.db-cache",true);
// Vertex Properties
PropertyKey value = mgmt.getPropertyKey(Constants.VertexPropertyKeys.Value);
if (value == null) {
value = mgmt.makePropertyKey(Constants.VertexPropertyKeys.Value).dataType(String.class).make();
mgmt.buildIndex(Constants.GraphIndexes.ByValue, Vertex.class).addKey(value).buildCompositeIndex(); // INDEX
}
PropertyKey shapeSet = mgmt.getPropertyKey(Constants.VertexPropertyKeys.ShapeSet);
if (shapeSet == null) {
shapeSet = mgmt.makePropertyKey(Constants.VertexPropertyKeys.ShapeSet).dataType(String.class).cardinality(Cardinality.SET).make();
mgmt.buildIndex(Constants.GraphIndexes.ByShape, Vertex.class).addKey(shapeSet).buildCompositeIndex();
}
...
// Edge Labels and Properties
EdgeLabel uses = mgmt.getEdgeLabel(Constants.EdgeLabels.Uses);
if (uses == null) {
uses = mgmt.makeEdgeLabel(Constants.EdgeLabels.Uses).multiplicity(Multiplicity.MULTI).make();
PropertyKey timestampE = mgmt.getPropertyKey(Constants.EdgePropertyKeys.Timestamp);
if (timestampE == null) {
timestampE = mgmt.makePropertyKey(Constants.EdgePropertyKeys.Timestamp).dataType(Long.class).make();
}
PropertyKey endpointIDE = mgmt.getPropertyKey(Constants.EdgePropertyKeys.EndpointId);
if (endpointIDE == null) {
endpointIDE = mgmt.makePropertyKey(Constants.EdgePropertyKeys.EndpointId).dataType(String.class).make();
}
// Indexes
mgmt.buildEdgeIndex(uses, Constants.EdgeIndexes.ByEndpointIDAndTimestamp, Direction.BOTH, endpointIDE,
timestampE);
}
mgmt.commit();
}
答案 0 :(得分:0)
您期望遇到的行为。今天,DynamoDB Local是一个基于SQLite的测试工具。如果您需要为大型和定期数据加载支持高TPS,我建议您使用DynamoDB服务。