本文介绍在不加载全部数据到内存的前提下,使用 pyarrow 原生 api 对百gb级 arrow 表(如 hugging face dataset 导出的 `.arrow` 文件)进行高效、可复现、带/不带放回的随机采样,并保持原始索引完整性。
当处理像 181 GB、3000 万行这样的超大规模 PyArrow 数据集时,常规思路(如 to_pandas() 后调用 df.sample())极易因内存溢出导致 Python 进程崩溃。根本原因在于:Pandas 需将整个 Arrow 表解码为列式 NumPy 数组并载入内存——这不仅浪费资源,更违背了 Arrow “零拷贝”与“延迟计算”的设计哲学。
幸运的是,PyArrow 提供了完全内存友好的原生采样能力:Table.take(indices)。该方法仅根据整数索引序列,以 O(1) 时间复杂度按需提取指定行,底层不触发全量解码,也不复制原始数据块,真正实现“采样即取用”。
以下是一个健壮、可复用的采样函数,支持带放回(replace=True)与不带放回(replace=False)两种模式,并保留原始行索引(便于后续溯源或去重分析):