gpt4 book ai didi

node.js - 使用 Redis 和 MongoDB (HyperLogLog) 计算唯一值

转载 作者:可可西里 更新时间:2023-11-01 11:30:36 26 4
gpt4 key购买 nike

我在 MongoDB 中有一个集合,其中包含一个示例文档,如下所示 -

{
"_id" : ObjectId("58114e5e43d6420b7db4e15c"),
"browser" : "Chrome",
"name": "hyades",
"country" : "in",
"day" : "16-10-21",
"ip" : "0.0.0.0",
"class" : "A123"
}

问题陈述

我应该能够在获取不同数量的 IP 的同时对任何字段进行分组。

聚合查询——

[
{$group: {_id: '$class', ip_arr: {$addToSet: '$ip'}}},
{$project: {class: '$_id.class', ip: {$size: '$ip_arr'}}}
]

给出了预期的结果,但速度很慢。同样,使用另一个 $group 计算 ip 的速度很慢。输出是 -

[{class: "A123",ip: 42},{class: "B123", ip: 56}..] 

我尝试过的

我考虑过为此使用 Hyperloglog。我尝试使用 Redis 实现。我尝试流式传输整个数据,仅投影我分组的内容,并将其 PFADD 放入 redis 中相应的 hyperloglog 结构中。

逻辑看起来像 -

var stream = Model.find({}, {ip: 1, class: 1}).stream();
stream.on('data', function (doc) {
var hash = "HLL/" + doc.class;
client.pfadd(hash, doc.ip);
});

我尝试针对超过一百万个数据点运行此程序。要流式传输的数据大小约为 1GB,Mongo 和 Node 服务器之间的连接速度为 1 Gbps。我原以为这段代码会运行得足够快。但是,它非常慢(比 MongoDB 中的计数慢)。

我想到但没有实现的另一件事是为每个类预先创建桶,并随着数据流入实时增加它们。但是支持任意分组所需的内存是巨大的,所以不得不放弃这个想法.

请提出我可能做错的地方,或者我可以在这里改进的地方,以便我能够充分利用 hyperloglog(我不受 Redis 的限制,并且对任何实现都持开放态度)

最佳答案

免责声明:我只使用了 C++ 和 Python 中的 redis,所以这可能无济于事,但是......

PFADD支持多个参数;在我使用 redis HLL 计算唯一条目的系统中,我发现对它们进行批处理并一次发送一个包含许多(大约 100 个)项目的 PFADD 导致显着加速 - 大概是由于避免了 redis 客户端往返。

关于node.js - 使用 Redis 和 MongoDB (HyperLogLog) 计算唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40658670/

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