跳转至

Vaex 大数据处理

为什么要学 Vaex

Vaex 是一个 Python 库,用于处理不适合放入内存的大型表格数据。它通过内存映射(memory-mapped)、延迟计算和零内存复制技术,能够在笔记本电脑上处理数十亿行数据。与 Pandas 不同,Vaex 不会把全部数据加载到内存中。对于需要在本地分析大数据集(几十 GB 到上百 GB)的数据科学家来说,Vaex 是最实用的选择。


核心概念

概念白话解释用途
Memory Mapping内存映射文件映射到虚拟内存,按需读取
Lazy Evaluation延迟计算表达式不立即执行,优化后批量处理
Virtual Columns虚拟列计算列不占用额外内存
Aggregation聚合高效的统计计算
Binning分箱多维统计和直方图

安装配置

pip install vaex

快速上手

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