gpt4 book ai didi

python - 从 Python 快速查询大型 MongoDB 集合

转载 作者:可可西里 更新时间:2023-11-01 10:40:22 24 4
gpt4 key购买 nike

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

一些细节:

  1. 数据库为我查询的所有字段建立了索引,包括时间和文本。

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

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

  4. 查询的字段类型有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 中,我几乎可以立即查询一个多小时。

最佳答案

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

关于python - 从 Python 快速查询大型 MongoDB 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46163682/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com