我目前正在开展一个项目,该项目涉及可视化超过100万条目(推文)的不断增长的数据库,并遇到一些我不确定如何面对的Python瓶颈。
一些细节:
数据库已在我查询的所有字段上编制索引,包括时间和文字。
集合中的每个条目都包含一个非常大且复杂的结构,有近100个嵌套字段。
我只投影少量列,因为可视化只需要一小部分存储数据。
查询的字段包含String,float32 / 64,date和id类型。
在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中,我几乎可以立即查询一个小时。
答案 0 :(得分:1)
试试我们的原型BSON-NumPy library。它避免了PyMongo(在将文档转换为NumPy数组中的行之前必须将文档转换为dicts)的开销,以及Monary的开销(由于与字段名称匹配的n平方算法,因此减慢了大型文档的开销NumPy专栏)。如果您有任何问题,请通过the BSON-NumPy issue tracker告诉我们。