面向 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 物理核) |