我有一个大约8个Mio文档(时间序列)的MongoDB集合,每个文档都有大约。 15个字段,5个int和float字段,1次,其余字符串。 bson转储为7.8GB。
如果可能的话,我正在尝试在笔记本电脑上运行它:
Kubuntu 19.04、8GB RAM,4核Intel i5 7200
我想做的是,基于一个字段选择所有唯一的文档,然后执行数据清理/改进。
起作用的伪代码:
# get Data from Mongo
cursor = collection.find({}).sort("time", -1).limit(1000000)
# build list to load in pandas
ccd_list = []
for row in cursor:
ccd_list.append(row)
pd_ccd = pd.DataFrame ( ccd_list )
# delete 10 non required fields
del pd_ccd['non_required_field']
# drop duplicates with pandas:
pd_ccd = pd_ccd.drop_duplicates(subset='title', keep='first')
此脚本运行大约需要一分钟时间,并且从启动前的2.8GB内存开始,直至大约3GB。峰值时为7GB。
我也尝试了聚合方法
cursor = collection.aggregate(
[
#{'$limit' : 500 },
{
'$match': {"title": {"$ne": None }}
},
{
'$match': {"title": {"$ne": "" }}
},
{
'$group':
{
'_id' : '$_id',
'title': {'$first': '$title'},
'referring_id': {'$first': '$referring_id'}
}
}
], allowDiskUse= True
)
使用$ limit运算符,它可以在一秒钟内运行。
如果没有,我不需要使用allowDiskUse
,否则几秒钟后我会得到Exceeded memory limit for $group
。
使用allowDiskUse,我可以看到htop
中的RAM已满,然后交换了,然后一切都变得没有响应。一个小时左右后,我将关闭笔记本电脑。
还有其他尝试方法吗? 我需要为标题或类似内容创建索引吗?