从Python快速查询大型MongoDB集合

时间:2017-09-11 20:12:39

标签: python mongodb pandas pymongo monary

我目前正在开展一个项目,该项目涉及可视化超过100万条目(推文)的不断增长的数据库,并遇到一些我不确定如何面对的Python瓶颈。

一些细节:

  1. 数据库已在我查询的所有字段上编制索引,包括时间和文字。

  2. 集合中的每个条目都包含一个非常大且复杂的结构,有近100个嵌套字段。

  3. 我只投影少量列,因为可视化只需要一小部分存储数据。

  4. 查询的字段包含String,float32 / 64,date和id类型。

  5. 在Mongo shell中查询给定日期范围的数据时,处理时间超出了可接受范围,但是,在Python中进行的任何查询都会成倍增长。虽然我认为我对于为什么会发生这种情况有一个很好的理解,但我没有足够的知识来找到解决方案。

    我使用了PyMongo和Monary,结果令人失望。

    有没有明显的解决方案让Python中的处理时间更接近Mongo shell中的时间?我想到的想法包括让Mongo在转移到Python之前将查询结果保存到单独的集合中,并尝试使用基于Javascript的解决方案而不是Python / Pandas。

    使用Monary的此查询(在10秒的时间内)返回2878行,并且需要76秒。

        start_time = datetime.datetime.strptime('2017-09-09 00:00:00', '%Y-%m-%d 
        %H:%M:%S').replace(
            tzinfo=timeZone).astimezone(tz.tzutc())
        end_time = datetime.datetime.strptime('2017-09-09 00:10:00', '%Y-%m-%d 
        %H:%M:%S').replace(tzinfo=timeZone).astimezone(
            tz.tzutc())
    
        columns = ['created_at']
        type = ['date']
    
        arrays = mon.query(
                'streamingTwitterDB',
                'streamingTwitterDB',
                {'created_at': {'$gt': start_time, '$lte': end_time}},
                columns,
                type
            )
    
        df = numpy.matrix(arrays).transpose()
        df = pd.DataFrame(df, columns=columns)
    

    在mongo中,我几乎可以立即查询一个小时。

1 个答案:

答案 0 :(得分:1)

试试我们的原型BSON-NumPy library。它避免了PyMongo(在将文档转换为NumPy数组中的行之前必须将文档转换为dicts)的开销,以及Monary的开销(由于与字段名称匹配的n平方算法,因此减慢了大型文档的开销NumPy专栏)。如果您有任何问题,请通过the BSON-NumPy issue tracker告诉我们。