Neptune 插入数据慢

Neptune slow to insert data

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

g.V().has('dog', 'name', 'pluto').fold().\
    coalesce(__.unfold(), __.addV('dog').property('name', 'pluto')).store('dog').\
    V().has('person', 'name', '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(i7 和 16GB RAM)上执行这个脚本,我需要 4/5 分钟,但是使用一个带有 8CPU 和 32GB RAM 的 Neptune 实例,20 分钟后,脚本只执行了 10%。 Neptune怎么可能这么慢?

谢谢。

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

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