pymongo / pandas使用更少的系统资源来执行操作

时间:2019-06-17 19:20:31

标签: mongodb pandas pymongo

我有一个大约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已满,然后交换了,然后一切都变得没有响应。一个小时左右后,我将关闭笔记本电脑。

还有其他尝试方法吗? 我需要为标题或类似内容创建索引吗?

0 个答案:

没有答案