在我的系统中,我要求节点上的边数必须作为内部属性存储在顶点上,并且必须以顶点为中心的索引存储在特定的输出边上。这自然要求我在所有数据完成加载之后计算节点上的边数。我这样做如下:
long edgeCount = graph.getGraph().traversal().V(vertexId).bothE().count().next();
但是,当我将测试扩展到某些节点为“超级”节点时,在上一行中会收到以下异常:
Caused by: com.netflix.astyanax.connectionpool.exceptions.TransportException: TransportException: [host=127.0.0.1(127.0.0.1):9160, latency=4792(4792), attempts=1]org.apache.thrift.transport.TTransportException: Frame size (70936735) larger than max length (62914560)!
at com.netflix.astyanax.thrift.ThriftConverter.ToConnectionPoolException(ThriftConverter.java:197) ~[astyanax-thrift-3.8.0.jar!/:3.8.0]
at com.netflix.astyanax.thrift.AbstractOperationImpl.execute(AbstractOperationImpl.java:65) ~[astyanax-thrift-3.8.0.jar!/:3.8.0]
at com.netflix.astyanax.thrift.AbstractOperationImpl.execute(AbstractOperationImpl.java:28) ~[astyanax-thrift-3.8.0.jar!/:3.8.0]
at com.netflix.astyanax.thrift.ThriftSyncConnectionFactoryImpl$ThriftConnection.execute(ThriftSyncConnectionFactoryImpl.java:153) ~[astyanax-thrift-3.8.0.jar!/:3.8.0]
at com.netflix.astyanax.connectionpool.impl.AbstractExecuteWithFailoverImpl.tryOperation(AbstractExecuteWithFailoverImpl.java:119) ~[astyanax-core-3.8.0.jar!/:3.8.0]
at com.netflix.astyanax.connectionpool.impl.AbstractHostPartitionConnectionPool.executeWithFailover(AbstractHostPartitionConnectionPool.java:352) ~[astyanax-core-3.8.0.jar!/:3.8.0]
at com.netflix.astyanax.thrift.ThriftColumnFamilyQueryImpl$4.execute(ThriftColumnFamilyQueryImpl.java:538) ~[astyanax-thrift-3.8.0.jar!/:3.8.0]
at com.thinkaurelius.titan.diskstorage.cassandra.astyanax.AstyanaxKeyColumnValueStore.getNamesSlice(AstyanaxKeyColumnValueStore.java:112) ~[titan-cassandra-1.0.0.jar!/:na]
解决此问题的最佳方法是什么?我应该简单地增加帧大小还是有更好的方法来计算节点上的边数?
是的,您将需要增加框架尺寸。当您有一个超级节点时,需要从存储后端读取很大的一行,在OLAP情况下甚至如此。我同意,如果您打算在图形的每个顶点上进行计算,则最好将其作为OLAP操作来完成。
这个和其他一些好的技巧可以在这个Titan邮件列表线程中找到。请记住,链接已经很旧了,因此概念仍然有效,但是某些Titan配置属性名称可能有所不同。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句