vault backup: 2026-04-22 10:10:19
This commit is contained in:
+62
-74
@@ -244,89 +244,77 @@ graph LR
|
||||
|
||||
## 参考实现
|
||||
|
||||
### 伪代码
|
||||
### 核心实现(伪代码)
|
||||
|
||||
```python
|
||||
class HeavyKeeper:
|
||||
def __init__(self, m, L, threshold, decay_factor):
|
||||
self.m = m # 每层桶数
|
||||
self.L = L # 哈希层数
|
||||
self.threshold = threshold
|
||||
self.decay_factor = decay_factor # 衰减因子
|
||||
|
||||
# 初始化多层 sketch
|
||||
self.buckets = [[KeeperBucket() for _ in range(m)]
|
||||
for _ in range(L)]
|
||||
|
||||
# 初始化哈希函数
|
||||
self.hash_funcs = [get_hash_func(i) for i in range(L)]
|
||||
|
||||
def insert(self, item, timestamp):
|
||||
def __init__(self, m, L, decay_factor):
|
||||
self.m, self.L = m, L
|
||||
self.decay_factor = decay_factor
|
||||
self.buckets = [[Bucket() for _ in range(m)] for _ in range(L)]
|
||||
|
||||
def insert(self, item):
|
||||
for layer in range(self.L):
|
||||
idx = self.hash_funcs[layer](item) % self.m
|
||||
bucket = self.buckets[layer][idx]
|
||||
|
||||
bucket = self.buckets[layer][hash(item) % self.m]
|
||||
if bucket.item == item:
|
||||
# 守护项匹配,直接计数(大象流强化)
|
||||
bucket.count += 1
|
||||
bucket.last_seen = timestamp
|
||||
bucket.count += 1 # 守护项匹配,直接计数
|
||||
else:
|
||||
# 计算替换概率
|
||||
estimated_freq = self._estimate_freq(item)
|
||||
replace_prob = min(1, estimated_freq / bucket.count)
|
||||
|
||||
if random.random() < replace_prob:
|
||||
# 替换为新项(大象流夺权)
|
||||
bucket.item = item
|
||||
bucket.count = 1
|
||||
bucket.error = bucket.count
|
||||
bucket.last_seen = timestamp
|
||||
# 空桶直接占领;否则按概率争夺
|
||||
prob = 1 if bucket.count == 0 else min(1, self._estimate(item) / bucket.count)
|
||||
if random() < prob:
|
||||
bucket.item, bucket.count, bucket.error = item, 1, 0 # 替换为新项
|
||||
else:
|
||||
# 不替换,仅增加误差(老鼠流被阻拦)
|
||||
bucket.error += 1
|
||||
|
||||
def apply_decay(self, current_time):
|
||||
"""应用衰减机制"""
|
||||
for layer in range(self.L):
|
||||
for bucket in self.buckets[layer]:
|
||||
elapsed = current_time - bucket.last_seen
|
||||
if elapsed > DECAY_INTERVAL:
|
||||
bucket.count *= self.decay_factor
|
||||
bucket.error *= self.decay_factor
|
||||
|
||||
# 归零清理
|
||||
if bucket.count < 1:
|
||||
bucket.item = None
|
||||
bucket.count = 0
|
||||
bucket.error = 0
|
||||
|
||||
def query(self, item):
|
||||
"""查询Item的频率估计"""
|
||||
min_count = float('inf')
|
||||
for layer in range(self.L):
|
||||
idx = self.hash_funcs[layer](item) % self.m
|
||||
bucket = self.buckets[layer][idx]
|
||||
if bucket.item == item:
|
||||
min_count = min(min_count, bucket.count)
|
||||
|
||||
return min_count if min_count != float('inf') else 0
|
||||
|
||||
def get_top_k(self, k):
|
||||
"""获取Top K大象流"""
|
||||
candidates = {}
|
||||
for layer in range(self.L):
|
||||
for bucket in self.buckets[layer]:
|
||||
if bucket.count >= self.threshold and bucket.item:
|
||||
item = bucket.item
|
||||
candidates[item] = max(candidates.get(item, 0),
|
||||
bucket.count)
|
||||
|
||||
# 返回 Top-k
|
||||
return sorted(candidates.items(),
|
||||
key=lambda x: x[1],
|
||||
reverse=True)[:k]
|
||||
bucket.error += 1 # 不替换,仅增加误差
|
||||
```
|
||||
|
||||
### Go 参考实现
|
||||
|
||||
```go
|
||||
package heavykeeper
|
||||
|
||||
type Bucket struct {
|
||||
Item []byte
|
||||
Count uint32
|
||||
Error uint32
|
||||
}
|
||||
|
||||
type HeavyKeeper struct {
|
||||
m, L uint32
|
||||
decayFactor float64
|
||||
buckets [][]Bucket
|
||||
hashFuncs []func([]byte) uint64
|
||||
}
|
||||
|
||||
func (hk *HeavyKeeper) Insert(item []byte) {
|
||||
for layer := uint32(0); layer < hk.L; layer++ {
|
||||
idx := hk.hashFuncs[layer](item) % hk.m
|
||||
bucket := &hk.buckets[layer][idx]
|
||||
|
||||
if bytes.Equal(bucket.Item, item) {
|
||||
bucket.Count++
|
||||
continue
|
||||
}
|
||||
|
||||
var prob float64
|
||||
if bucket.Count == 0 {
|
||||
prob = 1 // 空桶直接占领
|
||||
} else {
|
||||
prob = float64(hk.estimate(item)) / float64(bucket.Count)
|
||||
if prob > 1 {
|
||||
prob = 1
|
||||
}
|
||||
}
|
||||
if rand.Float64() < prob {
|
||||
bucket.Item, bucket.Count, bucket.Error = item, 1, 0
|
||||
} else {
|
||||
bucket.Error++
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
> **说明**:`insert` 是核心逻辑——对每层哈希找桶,匹配守护项则计数,否则按概率争夺。伪代码省略了衰减、查询、Top-K 等辅助方法,实际部署时按需补充。
|
||||
|
||||
## 相关算法对比
|
||||
|
||||
| 算法 | 空间复杂度 | 大象流准确性 | 老鼠流过滤 | 衰减支持 | 适用场景 |
|
||||
|
||||
@@ -0,0 +1,132 @@
|
||||
---
|
||||
tags: [CS, TOOLS, Docker, 容器化]
|
||||
create time: 2026-04-21
|
||||
---
|
||||
|
||||
# Docker 安装指南
|
||||
|
||||
## 概述
|
||||
|
||||
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
|
||||
|
||||
## 系统要求
|
||||
|
||||
- Ubuntu 24.04 LTS (Jammy Jellyfish)
|
||||
- 64-bit architecture
|
||||
- 内核版本 4.15 或更高版本
|
||||
|
||||
## 安装步骤
|
||||
|
||||
### 1. 更新系统包索引
|
||||
|
||||
```bash
|
||||
sudo apt update
|
||||
```
|
||||
|
||||
### 2. 安装必要的依赖包
|
||||
|
||||
```bash
|
||||
sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release
|
||||
```
|
||||
|
||||
### 3. 添加 Docker 官方 GPG 密钥
|
||||
|
||||
```bash
|
||||
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
|
||||
```
|
||||
|
||||
### 4. 添加 Docker APT 仓库
|
||||
|
||||
```bash
|
||||
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||||
```
|
||||
|
||||
### 5. 更新包索引
|
||||
|
||||
```bash
|
||||
sudo apt update
|
||||
```
|
||||
|
||||
### 6. 安装 Docker Engine
|
||||
|
||||
```bash
|
||||
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
|
||||
```
|
||||
|
||||
### 7. 启动并启用 Docker 服务
|
||||
|
||||
```bash
|
||||
sudo systemctl start docker
|
||||
sudo systemctl enable docker
|
||||
```
|
||||
|
||||
### 8. 将当前用户添加到 docker 组(可选,但推荐)
|
||||
|
||||
```bash
|
||||
sudo usermod -aG docker $USER
|
||||
```
|
||||
|
||||
> 请注意:执行此命令后,需要重新登录或运行 `newgrp docker` 命令使组成员身份生效。
|
||||
|
||||
## 验证安装
|
||||
|
||||
执行以下命令来验证 Docker 是否正确安装:
|
||||
|
||||
```bash
|
||||
docker --version
|
||||
```
|
||||
|
||||
运行一个简单的测试容器:
|
||||
|
||||
```bash
|
||||
docker run hello-world
|
||||
```
|
||||
|
||||
## 常用命令
|
||||
|
||||
| 命令 | 说明 |
|
||||
|------|------|
|
||||
| `docker pull [镜像名]` | 拉取镜像 |
|
||||
| `docker run [镜像名]` | 运行容器 |
|
||||
| `docker ps` | 显示正在运行的容器 |
|
||||
| `docker ps -a` | 显示所有容器 |
|
||||
| `docker images` | 显示所有镜像 |
|
||||
| `docker stop [容器名/ID]` | 停止容器 |
|
||||
| `docker rm [容器名/ID]` | 删除容器 |
|
||||
| `docker rmi [镜像名/ID]` | 删除镜像 |
|
||||
|
||||
## 后续操作
|
||||
|
||||
- **Docker Compose**:如果您需要使用 Docker Compose,在安装 Docker 时已包含,可直接使用
|
||||
- **配置 Docker**:可以修改 `/etc/docker/daemon.json` 文件进行配置
|
||||
|
||||
## 安全说明
|
||||
|
||||
- 不要使用 root 用户运行 Docker
|
||||
- 为非 root 用户添加 docker 组时要小心,因为该用户将具有 root 权限
|
||||
- 定期更新 Docker 和容器镜像
|
||||
|
||||
## 故障排除
|
||||
|
||||
### 权限问题
|
||||
|
||||
如果遇到权限问题,确保当前用户已被添加到 docker 组中:
|
||||
|
||||
```bash
|
||||
sudo usermod -aG docker $USER
|
||||
```
|
||||
|
||||
然后注销并重新登录。
|
||||
|
||||
### 服务启动失败
|
||||
|
||||
如果 Docker 服务无法启动,可以检查其状态:
|
||||
|
||||
```bash
|
||||
sudo systemctl status docker
|
||||
```
|
||||
|
||||
## 参考资料
|
||||
|
||||
- [Docker 官方安装指南](https://docs.docker.com/engine/install/ubuntu/)
|
||||
- [Ubuntu 24.04 Docker 安装文档](https://ubuntu.com/server/docs/container-docker)
|
||||
Reference in New Issue
Block a user