Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

P2 — DuckDB 大数据优化实践

面向 Windows Server 2022 + AMD 9950X3D + 64GB RAM + 4TB NVMe 的 DuckDB 容量评估、参数调优、单列 TXT 导入与查询优化。

核心结论(先看这个)

问题 答案
最大能查多少? 交互舒适约 压缩后 20–40GB;Out-of-core 选择性查询可到 百 GB~1TB+;盘上限约 3TB 可用空间
10GB + LIKE '%x%' 慢? 正常:中间模糊匹配无法走 ART;先调优全表扫,再上 Bloom N-gram 过滤,要亚秒则上外部搜索引擎
20GB≈3s / 40GB≈10s 预期近线性;多 Parquet 拆分不能少扫字节,明显加速请上 Bloom / 外部搜索
目标约 1TB 模糊查 DuckDB 裸扫约数分钟级,交互请走 外部搜索引擎;见子串文档 §7
行长 <500~2000 docs/duckdb-substring-like-optimization.md
推荐做法 read_csv 批量导入 → Parquet → contains+LIMIT/count → Bloom →(可选)倒排
大文件转 UTF-8 OOM 10_convert_to_utf8.py / Convert-ToUtf8.ps1 流式转码,或 read_csv(encoding:=...)

完整说明:

目录

docs/duckdb-capacity-and-optimization.md   # 容量 + 优化详解
sql/                                       # 可直接 .read 的 SQL
scripts/duckdb/                            # Python 导入/优化/查询/基准
data/                                      # 本地数据(raw/tmp 已 gitignore)

快速开始

cd D:\Project\Kimi\C2Lab\P2
uv sync

# 可选:生成样本并跑通基准(默认脚本参数可改)
uv run python scripts\duckdb\05_benchmark.py --rows 1000000

# 导入你的单列 TXT(推荐 read_csv;脏数据可加 --ignore-errors)
$env:DUCKDB_DATA_ROOT = "D:\duckdb_data"   # 建议指到 NVMe 数据盘
uv run python scripts\duckdb\02_import_single_column_txt.py --input "D:\duckdb_data\raw\data.txt"

# 几十 GB 非 UTF-8:勿用 Get-Content 整文件转码(易 OOM),用流式脚本
uv run python scripts\duckdb\10_convert_to_utf8.py --input D:\duckdb_data\raw\big.txt --detect
uv run python scripts\duckdb\10_convert_to_utf8.py `
  --input D:\duckdb_data\raw\big.txt --from gb18030 `
  --output D:\duckdb_data\raw\big.utf8.txt

# 等值 / 子串查询计时
uv run python scripts\duckdb\04_query_examples.py --mode equality --value "某行完整内容"

# === 模糊匹配 LIKE '%x%'(你的场景)===
uv run python scripts\duckdb\09_benchmark_substring.py --rows 100000 --keyword "abc12"
# 对已导入的库:
uv run python scripts\duckdb\06_prepare_lines_with_id.py
uv run python scripts\duckdb\07_build_bloom_filter.py
uv run python scripts\duckdb\08_query_substring.py --mode count-scan --keyword "关键字"
uv run python scripts\duckdb\08_query_substring.py --mode count-bloom --keyword "关键字"

大文件可先切分再导入(并行更好):

uv run python scripts\duckdb\split_txt.py --input D:\duckdb_data\raw\big.txt --parts 16 --out-dir D:\duckdb_data\raw\parts
uv run python scripts\duckdb\02_import_single_column_txt.py --input "D:\duckdb_data\raw\parts\*.txt"

推荐会话参数

SET memory_limit = '48GB';
SET threads = 16;
SET preserve_insertion_order = false;
SET temp_directory = 'D:/duckdb_data/tmp';
SET max_temp_directory_size = '1500GB';

也可用:sql/01_configure.sql

环境变量

变量 默认 含义
DUCKDB_DATA_ROOT <repo>/data 库文件 / raw / parquet / tmp 根目录
DUCKDB_MEMORY 48GB memory_limit
DUCKDB_THREADS 16 线程数(9950X3D 物理核)

About

DuckDB capacity guidance and single-column TXT / LIKE substring optimization for Windows Server workstations

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages