海王星插入数据很慢

问题描述

我正在尝试使用 python 中的脚本加载数据,我在其中创建了 26000 个顶点和相关关系。 使用gremlin-python,脚本就像

g.V().has('dog','name','pluto').fold().\
    coalesce(__.unfold(),__.addV('dog').property('name','pluto')).store('dog').\
    V().has('person','sam').fold().\
    coalesce(__.unfold(),__.addV('person').property('name','sam')).store('person').\
    select('person').unfold().\
    coalesce(__.outE('has_dog').where(__.inV().where(eq('dog')).by(T.id).by(__.unfold().id())),__.addE('has_dog').to(__.select('person').unfold())).toList()

在同一个事务中,我最多可以添加 50 个顶点和边。 如果我在我的 PC(具有 16GB RAM 的 i7)中执行此脚本,我需要 4/5 分钟,但使用具有 8cpu 和 32GB RAM 的 Neptune 实例,20 分钟后,脚本仅执行 10%。 海王星怎么可能这么慢?

谢谢。

解决方法

您连接的每个 Neptune 实例都有一个工作线程池。该池将是实例上 vCPU 数量的两倍。如果您以单线程方式发送查询,则您只会利用一个工作线程。您可以通过将工作分配到应用程序中的多个任务来显着提高吞吐率。我经常使用多线程库,但即使使用基本的 Python 线程也可能有所帮助,因为这些是 IO 绑定任务,因此线程可能会屈服。我以这种方式使用 Python 添加了数百万个顶点和边。如果不执行此类操作,您就无法充分利用实例上的可用资源。如果您已将工作分成 50 个批次,则可以将这些批次分散到多个线程中。将客户端线程/任务的数量与 Neptune 实例上 vCPU 数量的两倍相匹配是一个不错的起点。

理想情况下,线程将接触图的不同部分,以避免同时尝试从并发线程修改相同的顶点和边。