我正在尝试分析存储在 MongoDB 中的包含 150k 消息(约 40MB)的 Facebook 对话。我注意到将数据从 MongoDB 传输到 pandas 的时间很长(大约需要 25 秒),并且我发现 data = [msg for msg incursor]
是减慢该过程的步骤。
是否有更快的方法将 MongoDB 游标转换为 DataFrame?
这是我的一些代码:
from pymongo import MongoClient
import pandas as pd
connection = MongoClient(MONGODB_URI)
database = connection[DBS_NAME]
messages = database['messages']
cursor = messages.find(projection=FIELDS)
data = [msg for msg in cursor]
df = pd.DataFrame(data)
我也可以用 df = pd.DataFrame(list(cursor))
或 df = pd.DataFrame.from_records(cursor)
替换此步骤,但仍然需要25秒。
我说它很慢,因为我想制作图表来显示谁发送的消息最多,并将它们放在网站中。我使用 Flask 在 Python 中进行分析,并将包含已处理数据的 json 传输到 JavaScript。这样,每次您进入网站时,它都会进行数据处理,我不希望在显示图表之前花费 25 秒。
最佳答案
在 mongodb 中而不是 Flask 中进行聚合
您可以将繁重的工作委托(delegate)给 mongodb,将数据从 mongodb 中取出需要 I/O,并且除非您的客户端和 mongo 服务器能够处理 40MB/秒,否则您无法将时间减少到亚秒。
db.getCollection('COLLECTION').aggregate([{$sortByCount: "$FIELD11"}, {$limit : 10}])
运行时间为 0.6 秒,大约有 30 万条记录
关于python - 将数据从 MongoDB 游标加载到 pandas Dataframe 的更快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59080521/