【问题标题】:Best way to import bulk data into ArangoDB将批量数据导入 ArangoDB 的最佳方法
【发布时间】:2016-08-16 15:37:06
【问题描述】:

我目前正在研究 ArangoDB POC。我发现使用 PyArango 在 ArangoDB 中创建文档所花费的时间非常长。插入 300 个文档大约需要 5 分钟。我已经粘贴了下面的粗略代码,如果有更好的方法可以加快速度,请告诉我:

with open('abc.csv') as fp:
for line in fp:
    dataList = line.split(",")

    aaa = dbObj['aaa'].createDocument()
    bbb = dbObj['bbb'].createDocument() 
    ccc = dbObj['ccc'].createEdge()

    bbb['bbb'] = dataList[1]
    aaa['aaa'] = dataList[0]
    aaa._key = dataList[0]

    aaa.save()
    bbb.save()

    ccc.links(aaa,bbb)
    ccc['related_to'] = "gfdgf"
    ccc['weight'] = 0

    ccc.save()

不同的集合由以下代码创建:

 dbObj.createCollection(className='aaa', waitForSync=False)

【问题讨论】:

  • 你考虑过arangoimp吗?如有必要,您可以使用 Python 对源数据进行预处理,但导入本身应由 arangoimp 完成,它使用 ArangoDB 的批量导入 API 来提高效率。
  • 我查看了 arangoimp,看起来数据应该是 JSON 格式,CSV 文件已经存在主键。我在这里看到的问题是我将无法处理重复的节点,这些节点可能已经存在于数据库中。是否有任何特定的选项来处理这些条件,我在 ArangoImp 文档中找不到任何选项
  • pyArango 当前遇到了 HTTP keep-alive 的问题 - 它不会重用连接,因此最终会重新进行 DNS 查找。我们目前正在调查这可能是什么原因以及如何解决它。
  • @dothebart:感谢您提供的信息。我最近尝试使用 ArangoDB 的 java 驱动程序,启用批处理模式后,它以大约 1000 个文档/秒的速率传输数据,但是边缘集合没有在其中更新。删除批处理模式后,相同的代码更新了 Edge 集合。如果您对此有任何想法,请告诉我。
  • @pjesudhas:arangoimp 支持 JSON、CSV 和 TSV。不需要存在文档密钥。如果您忽略它,ArangoDB 将为您生成一个密钥。当然,您确实需要边缘的 _from 和 _to 属性来告诉它要链接哪些文档。这是使用文档 ID(_id,集合名称 + “/” + 文档键)完成的。您要链接的文档实际上不必存在,只有集合必须存在。有关如何处理重复文档,请参见此处:docs.arangodb.com/3.0/Manual/Administration/…

标签: graph arangodb pyarango


【解决方案1】:

解决您在 arango java 驱动程序中的批处理模式问题。如果您知道顶点的关键属性,您可以通过“collectionName”+“/”+“documentKey”构建文档句柄。 示例:

arangoDriver.startBatchMode();

for(String line : lines)
{
  String[] data = line.split(",");

  BaseDocument device = new BaseDocument();
  BaseDocument phyAddress = new BaseDocument(); 
  BaseDocument conn = new BaseDocument();

  String keyDevice = data[0];
  String handleDevice = "DeviceId/" + keyDevice; 

  device.setDocumentKey(keyDevice);

  device.addAttribute("device_id",data[0]);

  String keyPhyAddress = data[1];
  String handlePhyAddress = "PhysicalLocation/" + keyPhyAddress; 

  phyAddress.setDocumentKey(keyPhyAddress);

  phyAddress.addAttribute("address",data[1]);

  final DocumentEntity<BaseDocument> from = arangoDriver.graphCreateVertex("testGraph", "DeviceId", device, null);       
  final DocumentEntity<BaseDocument> to = arangoDriver.graphCreateVertex("testGraph", "PhysicalLocation", phyAddress, null);

  arangoDriver.graphCreateEdge("testGraph", "DeviceId_PhysicalLocation", null, handleDevice, handlePhyAddress, null, null);

}
arangoDriver.executeBatch();

【讨论】:

    【解决方案2】:

    我将构建所有要插入到 json 格式的字符串中的数据,并使用 createDocumentRaw 一次性创建所有数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-22
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      • 2021-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多