如何改进对mongodb的XML导入?

2024-05-23 15:27:07 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我很感激你的建议。


Tags: 文件数据文档httpsgithub脚本com数据库
2条回答

Storing these documents on an array before inserting would be a good idea?

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

How many documents should I store before inserting, then?

这很难说,因为这取决于很多因素。经验法则:1000-10000。你得做点实验。在mongodb的旧版本中,整个批处理不能大于16MB的文档大小限制。

Writing the jsons into a file and then using mongoimport would be faster?

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

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

如果您想将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

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/

相关问题 更多 >