使用Python和MongoDB索引2000万条记录
我想分享一下我的小项目,看看我是不是在正确的方向上。我需要处理来自Medline的所有文章(http://www.nlm.nih.gov/bsd/licensee/2011_stats/baseline_doc.html)。如果你对Medline数据库不太了解,我来简单介绍一下:
- 这个数据库大约有2000万个记录(占用83.4 GB的磁盘空间),每个记录都有很多字段和子字段。
- 你可以下载这个数据库(需要许可证),格式是XML。
- 这2000万个记录分布在653个文件中。
- 每个文件包含一个MedlineCitationSet,这个集合里有多个记录(MedlineCitation)。
我想处理这些记录,提取一些信息,比如标题、摘要等等。然后我想用Python和MongoDB来为这些文件(或记录)建立索引。我有一个想法:
我创建了一个Medline解析器,为每个记录生成一个JSON条目,存入MongoDB,并根据pubmedID进行索引。这样我就可以创建一个像get_abstract('pubmedID'):string这样的函数。
我有几个问题:
- 这个想法好吗?(XML解析 -> JSON -> 插入和索引!)
- 我可以使用GridFS来获取每个文件对应的记录块吗?怎么做?
- 你知道其他的方法吗?
1 个回答
2
这样做好吗?(把XML解析成JSON,然后插入和索引!)
这样可行吗?JSON通常比XML小,所以这个改变可能是个不错的选择。
我可以使用GridFS来获取每个文件的记录块吗?怎么做?
GridFS一般是用来存储静态文件,比如图片或视频。MongoDB可以支持非常大的文档(16MB相当于几本小说)。而一篇medline文章的文本通常会小得多。
如果你只是打算存储文本,那就不需要用GridFS。如果你想存储图片,那么GridFS会很有用。
请在这里了解GridFS。注意,GridFS只是一个规范,所有内容仍然存储在普通的MongoDB集合中。
附注:看起来pubmedID
是一个唯一的键。你可以通过在创建文档时用pubmedID
覆盖_id
来节省空间。
也就是说: collection.insert({"_id": xml_obj.pubmedID, "text" : xml_obj.article_text})