

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 创建高效的多线程 Gremlin 写入
<a name="best-practices-gremlin-multithreaded-writes"></a>

使用 Gremlin 将数据通过多线程加载到 Neptune 时，有一些指导方针可供遵循。

如果有可能，向每个线程提供一组可以插入或修改而不造成冲突的顶点或边缘。例如，线程 1 地址 ID 范围是 1–50000，线程 2 地址 ID 范围是 50001–100000，以此类推。这会减少造成 `ConcurrentModificationException` 的可能性。为安全起见，围绕所有写入放置一个 `try/catch` 块。如果出现任何失败，您可在短暂延迟后重试它们。

以介于 50 到 100（顶点或边缘）之间的批大小进行的批量写入通常可以很好地工作。如果您要为每个顶点添加大量属性，其数量接近 50，那么 100 是比较好的选择。进行一些试验是值得的。因此，对于批量写入，您可以使用类似于下文的方法：

```
g.addV(‘test’).property(id,’1’).as(‘a’).
  addV(‘test’).property(id,’2’).
  addE(‘friend’).to(‘a’).
```

然后，在每个批量操作中重复此方法。

相比在 Gremlin 与服务器的每次往返通信中添加一个顶点或边缘，使用批处理可大幅提升效率。

如果您使用 Gremlin 语言变体 (GLV) 客户端，则可以先创建遍历以便用编程方式创建批处理。然后在其中进行添加，最后对其进行迭代，例如：

```
  t.addV(‘test’).property(id,’1’).as(‘a’)
  t.addV(‘test’).property(id,’2’)
  t.addE(‘friend’).to(‘a’)
  t.iterate()
```

如果可能，最好是使用 Gremlin 语言变体客户端。不过您可以使用其他客户端执行类似的操作，通过将字符串连接起来构建一个批次，以文本字符串的格式提交查询。

如果您使用的是 Gremlin 客户端库之一而不是基本 HTTP 进行查询，线程应该全部共享同一个客户端、集群或连接池。您可能需要调整设置来实现尽可能最佳的吞吐量，诸如 Gremlin 客户端使用的连接池大小和工作线程数等设置。