如何改进将XML导入到MongoDB的方法?

3
我有一些大型XML文件(每个文件大小约为5GB),需要将它们导入到MongoDB数据库中。我正在使用Expat解析文档,进行一些数据操作(删除某些字段,单位转换等),然后将其插入到数据库中。我的脚本基于此脚本:https://github.com/bgianfo/stackoverflow-mongodb/blob/master/so-import 我的问题是:是否有一种方法可以通过批量插入来改进这个过程?将这些文档存储在数组中再进行插入是否是一个好主意?在插入之前应该存储多少个文档?将JSON写入文件,然后使用mongoimport会更快吗?
感谢任何建议。
2个回答

3
如果您想将XML导入MongoDB,而Python是您目前选择的工具,但您也愿意尝试其他方法,那么可以使用以下步骤完成:
  1. 使用XMLStarlet将XML文档转换为CSV文档
  2. 使用AWK将CSV转换为包含JSON的文件
  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/


1
存储这些文档在插入之前放在一个数组里是个好主意吗?
是的,很可能是。这样可以减少到数据库的往返次数。你应该监控你的系统,因为在插入时它可能会闲置很多时间,因为IO等待(也就是说,开销和线程同步所花费的时间比实际数据传输要多得多)。
那么在插入之前我应该存储多少个文档呢?
这很难说,因为它取决于很多因素。经验法则:1,000-10,000。你将不得不做一些实验。在旧版本的mongodb中,整个批处理的大小不能超过16MB的文档大小限制。
把json写入文件,然后使用mongoimport会更快吗?
不会,除非你的代码有缺陷。这意味着你必须复制数据两次,整个操作应该是IO绑定的。
另外,最好先添加所有文档,然后再添加任何索引,而不是反过来(因为那样索引每次插入都要进行修复)。

谢谢您的快速回复!我现在就开始“实验”数组大小 :) - Milena Araujo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接