【问题标题】:Default handling of simultaneous Gremlin queries同时 Gremlin 查询的默认处理
【发布时间】:2022-07-06 07:46:35
【问题描述】:

目标

我想了解 JanusGraph 处理同步 gremlin 查询的方式。它是顺序的还是并行的?它是如何决定的?
潜在的兴趣是我需要进行大量的计算和图形遍历。我的机器上的所有内容都在本地,虽然我已经并行化了 gremlinpython 脚本,但某处似乎存在瓶颈。

配置

  • JanusGraph 0.6.1 完整版
  • 本地图(默认使用conf/remote.yaml文件)

我在做什么

每个线程都是用几个属性创建的,特别是,它们都得到一个AnonymousTraversalSource。然后他们将从起始顶点列表中弹出一个元素,执行以下代码,并重复直到列表为空。

def job(vertex_id:int, g:AnonymousTraversalSource, length:int, nb_walks:int) -> str:
    random_walks = []
    for _ in range(nb_walks):
        random_walk = g.V(vertex_id).repeat(
            __.local(__.both().sample(1))
        ).times(length).path().next()
        random_walks.append(",".join([str(v.id) for v in random_walk]))
    return "\n".join(random_walks)

遍历是这样定义的:

connection = DriverRemoteConnection(<URL>, "g")
g = traversal().with_remote(connection)

我尝试了什么

我试过了:

  • 提供相同的AnonymousTraversalSource 对象
  • 提供不同的AnonymousTraversalSource 对象,用相同的DriverRemoteConnection 对象实例化
  • 赋予不同的AnonymousTraversalSource 对象,这些对象由不同的DriverRemoteConnection 对象构建

这些选项都没有明显快于其他选项,它们都在 20-25 秒内进行了大约 500 次随机游走

问题

我构建DriverRemoteConnectionAnonymousTraversalSource 对象的方式是否存在问题?
有没有提高性能的方法?我是否达到了这种方式的极限?

【问题讨论】:

    标签: python gremlin janusgraph gremlinpython


    【解决方案1】:

    请记住,Python 线程与操作系统或 Java 等语言使用的抢占式多任务处理风格的线程不同。

    当您使用内置线程时,Python 使用协作式多任务处理。这意味着它们可能会在 IO 等待期间让步,但通常它们永远不会让步,而是一个接一个地运行。

    您可能需要考虑改用多处理库。

    在任何一种情况下,在线程之间共享g 对象都是正确的使用方法。

    如果您可以分享更多您正在使用的代码,特别是您如何创建和部署线程,我将酌情更新此答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多