Vaex 大数据处理¶
为什么要学 Vaex¶
Vaex 是一个 Python 库,用于处理不适合放入内存的大型表格数据。它通过内存映射(memory-mapped)、延迟计算和零内存复制技术,能够在笔记本电脑上处理数十亿行数据。与 Pandas 不同,Vaex 不会把全部数据加载到内存中。对于需要在本地分析大数据集(几十 GB 到上百 GB)的数据科学家来说,Vaex 是最实用的选择。
核心概念¶
| 概念 | 白话解释 | 用途 |
|---|---|---|
| Memory Mapping | 内存映射 | 文件映射到虚拟内存,按需读取 |
| Lazy Evaluation | 延迟计算 | 表达式不立即执行,优化后批量处理 |
| Virtual Columns | 虚拟列 | 计算列不占用额外内存 |
| Aggregation | 聚合 | 高效的统计计算 |
| Binning | 分箱 | 多维统计和直方图 |
安装配置¶
快速上手¶
import vaex
# 打开大文件(不加载到内存)
df = vaex.open("large_dataset.hdf5") # HDF5
df = vaex.open("data.parquet") # Parquet
df = vaex.open("data.csv") # CSV(自动转换)
print(f"行数: {len(df):,}")
print(f"列: {df.column_names}")
# 虚拟列(零内存开销)
df["full_name"] = df.first_name + " " + df.last_name
df["age_group"] = df.age // 10 * 10
# 过滤(延迟计算)
filtered = df[df.age > 25]
# 聚合
print(df.mean(df.salary))
print(df.count(df.department))
# 分组统计
result = df.groupby("department").agg({
"salary": "mean",
"age": ["min", "max"],
"id": "count"
})
进阶用法¶
高效数据转换¶
# CSV → HDF5(一次转换,后续快速读取)
df = vaex.from_csv("huge_file.csv", convert=True)
# 生成 huge_file.csv.hdf5
# 多文件合并
df = vaex.open_many(["part1.hdf5", "part2.hdf5"])
# 导出
df.export_parquet("output.parquet")
df.export_hdf5("output.hdf5")
分箱和可视化¶
# 二维直方图
df.plot(df.x, df.y, what="mean(z)", limits=[-10, 10])
# 统计分箱
counts = df.count(binby=df.age, limits=[0, 100], shape=20)
与 Pandas 互操作¶
# Vaex → Pandas(小数据集)
pandas_df = df.to_pandas_df(column_names=["name", "age"])
# Pandas → Vaex
vaex_df = vaex.from_pandas(pandas_df)
并行计算¶
# Vaex 自动使用多核
import vaex
df = vaex.open("large.hdf5")
# 复杂计算自动并行
result = df.groupby("category", agg={
"total": vaex.agg.sum("amount"),
"avg": vaex.agg.mean("price"),
"count": vaex.agg.count(),
})
常见问题¶
Q: 与 Dask 相比?¶
- Vaex:单机大数据,内存映射,适合探索性分析
- Dask:分布式计算,集群支持,适合 ETL 管道
Q: 支持哪些文件格式?¶
HDF5(最佳性能)、Parquet、CSV、Arrow、FITS 等。
Q: 内存映射对 SSD 有要求吗?¶
SSD 会显著提升随机访问性能。HDD 也可以使用但顺序扫描场景更合适。
参考资源¶
- GitHub:https://github.com/vaexio/vaex
- 文档:https://vaex.io/docs/
- 教程:https://vaex.io/docs/tutorial.html
- 论文:https://arxiv.org/abs/2010.12830