0

我使用跨国图在Orientdb 2.2.10上进行了测试

在单线程系统上使用以下Sudo 代码

   for(i = 1 to 1000)
{
    DB_Name = getRandomString()

    createGraphDb(DB_Name ) using OServerAdmin : if db do not exist
    gFactory = OrientGraphFactory(DB_Name ) : if db exist


    graph = OrientGraphFactory.getTx()
    previousEvent = null

    for(j=1 to 1000)
      {
        currentEvent = getrandomString()
        if(previousEvent and currentEvent != null)
              {
                   - create Vertex named currentVertex and edges between them 
                   - (from previous to current event)
              }
        else
              {
                    create vertex named current event 
              }
         previousEvent = currentEvent
      }
   graph.shutdown()

}

经过几次外部循环迭代后,我得到了以下异常。

Exception in thread "Thread-0" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Unknown Source)
at java.lang.String.<init>(Unknown Source)
at java.lang.String.substring(Unknown Source)
at java.lang.String.split(Unknown Source)
at java.lang.String.split(Unknown Source)
at com.orientechnologies.orient.core.config.OStorageConfiguration.fromStream(OStorageConfiguration.java:268)
at com.orientechnologies.orient.core.config.OStorageConfiguration.fromStream(OStorageConfiguration.java:497)
at com.orientechnologies.orient.core.config.OStorageConfiguration.load(OStorageConfiguration.java:207)
at com.orientechnologies.orient.client.remote.OStorageRemote.open(OStorageRemote.java:330)
at com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx.open(ODatabaseDocumentTx.java:257)
at com.orientechnologies.orient.core.db.OPartitionedDatabasePool$DatabaseDocumentTxPooled.internalOpen(OPartitionedDatabasePool.java:445)
at com.orientechnologies.orient.core.db.OPartitionedDatabasePool.openDatabase(OPartitionedDatabasePool.java:308)
at com.orientechnologies.orient.core.db.OPartitionedDatabasePool.acquire(OPartitionedDatabasePool.java:263)
at com.tinkerpop.blueprints.impls.orient.OrientBaseGraph.<init>(OrientBaseGraph.java:144)
at com.tinkerpop.blueprints.impls.orient.OrientTransactionalGraph.<init>(OrientTransactionalGraph.java:78)
at com.tinkerpop.blueprints.impls.orient.OrientGraph.<init>(OrientGraph.java:135)
at com.tinkerpop.blueprints.impls.orient.OrientGraphFactory.getTx(OrientGraphFactory.java:119)

他们对我的 sudo 代码或 OrientDb 有任何问题吗?

如果他们存在任何更好的方式,请提出建议。

谢谢..!

4

3 回答 3

3

你有多少演出的 ram 可用?例如,如果您可以为 Java 进程分配最大 8GB,则通常最好分配小堆和大磁盘缓存缓冲区(堆外内存)。所以而不是:

java -Xmx8g ...

你可以试试这个:

java -Xmx800m -Dstorage.diskCache.bufferSize=7200 ...

有关更多详细信息,您可以阅读官方文档中有关性能调整的页面。

希望能帮助到你。

于 2016-10-13T13:12:59.727 回答
1

您可以使用 -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintTenuringDistribution -Xloggc:$ORIENTDB_HOME/log/gc_%p_%t.log 在服务器上检查堆使用情况(可以添加最新的XX标志仅用于调查从新到旧的升级)。

您可以在客户端上添加类似的设置(仅更改 gc.log 选项)。我刚刚根据您的伪代码运行了一个 java 类(Mac 上的 8u102,具有 16gb 和 i7),但是运行了 1 个具有 1000 个顶点 + 边的循环(1 db)并且它成功完成了没有 OutOfMemory 的工作

再见克劳迪奥

于 2016-10-14T16:13:37.413 回答
0

在 OrientDB 中,事务将更改保存在 RAM 中,因此如果您有包含数十万个元素的事务,则可能会导致此问题。我建议你提交每个 X 元素。我建议从 1000 开始,然后根据结果进行调整。

于 2016-10-13T21:17:57.547 回答