如何改进XML导入到mongodb?

时间:2014-02-16 22:58:52

标签: python xml mongodb import pymongo

我有一些大型XML文件(每个5GB),我正在导入mongodb数据库。我正在使用Expat来解析文档,进行一些数据操作(删除一些字段,单位转换等),然后插入数据库。我的脚本基于这个:https://github.com/bgianfo/stackoverflow-mongodb/blob/master/so-import

我的问题是:有没有办法通过批量插入来改善这一点?在插入之前将这些文档存储在数组上是个好主意?插入前我应该存储多少文件呢?将jsons写入文件然后使用mongoimport会更快吗?

我感谢任何建议。

2 个答案:

答案 0 :(得分:3)

如果您想要将XML导入MongoDB,而Python正是您目前为完成这项工作而选择的,但您可以采取进一步的方法,那么也可以通过以下步骤执行此操作:

  1. transforming the XML documents to CSV documents using XMLStarlet
  2. transforming the CSVs to files containing JSONs using AWK
  3. 将JSON文件导入MongoDB
  4. XMLStarlet和AWK都非常快,您可以使用非平凡的结构(子对象,数组)存储JSON对象。


    http://www.joyofdata.de/blog/transforming-xml-document-into-csv-using-xmlstarlet/ http://www.joyofdata.de/blog/import-csv-into-mongodb-with-awk-json/

答案 1 :(得分:1)

  

在插入之前将这些文档存储在数组上是个好主意?

是的,这很有可能。它减少了到数据库的往返次数。您应该监视您的系统,因为IO等待(即开销和线程同步比实际数据传输花费的时间更多),它在插入时可能会闲置很多。

  

插入之前我应该​​存储多少个文件呢?

这很难说,因为它取决于很多因素。经验法则:1,000 - 10,000。你将不得不尝试一点。在旧版本的mongodb中,整个批处理不得大于16MB的文档大小限制。

  

将jsons写入文件然后使用mongoimport会更快吗?

不,除非你的代码有缺陷。这意味着您必须复制数据两次,整个操作应该是IO绑定。

此外,最好先添加所有文档,然后添加任何索引,而不是相反(因为那时索引必须在每次插入时修复)