vault backup: 2026-04-22 10:10:19

This commit is contained in:
2026-04-22 10:10:19 +08:00
parent 51f07228d3
commit 388d4439de
15 changed files with 1656 additions and 355 deletions
+62 -74
View File
@@ -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 等辅助方法,实际部署时按需补充。
## 相关算法对比
| 算法 | 空间复杂度 | 大象流准确性 | 老鼠流过滤 | 衰减支持 | 适用场景 |
+132
View File
@@ -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)