处理数据,大数据甚至更大数据的 17 种策略

2023-05-28 0 503

如何处置大统计数据和真正的大统计数据?

责任编辑最初发表在 Towards Data Science 网志,经原作 Jeff Hale 许可,InfoQ 英文站译者并撷取。

处置大统计数据可能很头疼。不能没人喜欢“缓存不足”的错误提示信息。也不能没人愿意等待标识符运行。更不用说会没人乐于舍弃 Python。

假如你遇到这些难题,请千万别恐惧!我将在责任编辑中为你提供更多许多基本功,并介绍许多即将面世的库,帮助你高效率地处置大统计数据。我还会为你提供更多软件系统,解决那些无法适合缓存的标识符难题。而这一切都将会在 Python 中展开。

Python 是最盛行科学和值排序C语言。对清扫标识符和开拓性统计数据挖掘而言, Pandas 是最畅销的。

在 Python 中采用 Pandas,能让你处置比 Microsoft Excel 或 Google Sheets 更多的统计数据。

SQL 统计资料库在储存统计数据各方面非常盛行,但是 Python 生态系在表达性、试验性、可重现性和加速执行统计数据挖掘、统计和机器学习的能力各方面,比 SQL 有很多优势。

意外的是,假如你是在邻近地区组织工作不然,所以,Pandas 所能处置的统计信息量将会受到你机器上的物理缓存容量限制。但假如你在用户端中组织工作,更多的缓存需求又意味着须要花费更多的资金。

无论你的标识符在哪里运行,你都希望操作能够加速展开,这种你就能完成任务!

总是要做的事情

假如你听说过或看见过关于加速标识符的提议,所以你一定看见过警示:千万别过早地强化!

总而言之 ,这是一条好提议。但懂许多基本功也是很精明的作法,这种你才能写下整洁、加速的标识符。

对任何规模的统计数据集而言,下面四种作法都是良好的代码实践。

尽量避免冗余循环式。点选该处能参看大 O 记号(Big-O notation)和演算法预测的简单预测。一个 for 循环式冗余在另一个 for 循环式里,一般会导致数列时间的排序。假如你有闻所未闻几个项目要搜寻不然,所以就须要等上一段时间。请看该处的图象和解释。在 Python 中尽量采用条目推论(List comprehension)(和词典推论(Dist comprehension))。按需建立条目比读取条目的 append 属性并将其作为函数反复调用要快:这要感谢 Stack Overflow Answer(译注:Stack Overflow 网站的一款 App,Stack Overflow 是一个程序设计领域的问答网站)。然而,一般而言,千万别为了速度而牺牲清晰度,所以在冗余条目推论务必要小心。在 Pandas,采用内置的函数向量化。其原理其实和词典推论的原因是一样的。一次将一个函数应用于整个统计数据结构比重复调用一个函数要快得多。

假如你发现自己正在申请,请想想你是否真的须要这种做。它将会遍历行或列。向量化方法通常速度更快,标识符更少,因此它们是一个双赢的方法。

要避免采用其他在统计数据上循环式的 Pandas Series 和 DataFrame 方法:applymap、itterrows、ittertuples。在 DataFrame 上采用replace方法,而不是任何其他选项,这种能节省大量时间。

请注意,这些提议可能不适用于非常少量的统计数据,但在这种情况下,风险很低,所以谁在乎呢?

这就涉及到我们最重要的规则

假如能,就继续用 Pandas。这是快乐的源泉。

假如你没有难题,也不希望统计数据膨胀,就千万别担心这些难题。但在某些时候,你会遇到一个大统计数据集,然后你会想知道该怎么做。让我们来看许多基本功。

处置相当大的统计数据(大约数百万行)

假如你要做机器学习,就用你的统计数据子集来探索、清扫,构建一个基线模型。加速解决 90% 的难题,节省时间和资源。这个基本功能帮你节省很多时间。在读取 DataFrame 时,只用usecols参数读取你须要的列。记住,更少的统计数据输入意味着胜利!有效地利用 dtype。将值列向下转换为对pandas.to_numeric()有意义的最小 dtypes。将基数较低的列(只有几个值)转换为分类 dtype。请参看这个关于高效率 dtype 的 Pandas 指南。在 Scikit-learn 将模型训练并行化,学习尽量采用更多的处置核心。默认情况下,Scikit-learn 只采用 CPU 的一个核心。许多排序机的 CPU 有 4 个或更多的核心。在采用 GridSearchCV 和许多其他类展开交叉验证时,通过传递参数n_jobs=-1,能将它们全部用于可并行化的任务。将 Pandas DataFrame 保存为 feather 或 pickle 格式,以加快读写速度。感谢 Martin Skarzynski,因为他提供更多了证据和标识符的链接。采用pd.eval加快 Pandas 的操作。将你常用的标识符以字符串形式传递给函数。它的操作速度更快。下面有一个试验图象,DataFrame 为 100 列。
处理数据,大数据甚至更大数据的 17 种策略

df.query与pd.eval基本相同,但它是作为 DataFrame 方法,而不是顶级 Pandas 函数。

由于存在许多难题,请注意查看文档。

Pandas 在幕后采用的是 Numexpr。Numexpr 还能与 NumPy 一起组织工作。向 Chris Conlan 致敬,感谢他的著作《 Fast Python 》(《加速 Python》),正是这本书,我才知道了 Numexpr。Chris 这本书是一本学习如何加速 Python 标识符的优秀读物。

处置真正的大统计数据(大约数千万行以上)

采用 Numba 。假如你在做数学排序,Numba 能给你带来极大的速度提升。安装 Numba 并导入它。然后,当你须要在 NumPy 统计数据上展开循环式,且不能采用向量化方法时,就采用@numba.jit装饰器函数。它只对 NumPy 统计数据有效。在 Pandas DataFrame 上使用.to_numpy()将其转换为 NumPy 数组。在有意义的时候采用 SciPy 稀疏矩阵。Scikit-learn 通过许多转换器(如 CountVectorizer)自动输出稀疏数组。当统计数据主要为 0 或缺少值时,能将列转换为 Panda 中的稀疏 dtype。要了解更多内容请点选该处。采用 Dask 将统计数据集的读取并行化为 Pandas 的统计数据块。Dask 还能跨多台机器执行并行化数据操作。它模仿了 Panda 和 NumPy API 的一个子集。 Dask_ML 是一个姊妹包,用于跨多台机器并行化机器学习演算法。它模仿了 Scikit-learn API。与其他盛行的机器学习库如 XGBoost、LightGBM、PyTorch 和 TensorFlow 很好地结合在一起。不管有没有 GPU,都能采用 PyTorch。正如我在这篇关于排序的文章中所发现的那样,在 GPU 上采用 PyTorch 能大大提高速度。

未来处置大统计数据须要注意 / 尝试的事项

以下三个方案是截止 2020 年年中的前沿方案。预计将会出现配置难题和早期 API。假如你是在邻近地区 CPU 上组织工作,这些方

你能采用很多 CPU 核心吗?你的统计数据是否超过 32 列(到 2020 年年中开始是必需的)?然后考虑一下 Modin 。它模仿 Pandas 的一个子集,以加快对大型统计数据集的操作。它在幕后采用的是 Apache Arrow(通过 Ray)或 Dask。Dask 后端是实验性的。在我的试验中,有些事情并不是很快,例如,从 NumPy 数组读取统计数据就很慢,并且缓存管理也是一个难题。你能采用 Jax 代替 NumPy。Jax 是 Google 开源的一款非常前沿的产品。它通过以下五个底层工具来加速操作:autograd、XLA、JIT、向量化器和并行化器。它能在 CPU、GPU 或 TPU 上组织工作,并且可能比采用 PyTorch 或 TensorFlow 来获得速度提升更简单。

Jax 也适用于深度学习。它目前有 NumPy 版本,但尚未提供更多 Pandas 版本。不过,你能将 DataFrame 转换为 TensorFlow 或 NumPy,然后再采用 Jax。请点选这里以了解更多内容。Rapids cuDF 在 GPU 上采用 Apache Arrow,并带有类似 Pandas 的 API。这是一个 NVIDIA 开源的 Python 包。Rapids 与 Dask 配合得很好,所以你能让多个 GPU 并行处置统计数据。对最大的组织工作复杂,它应该能带来一个很好的提升。

其他关于标识符速度和大统计数据的知识

计时操作

假如你想在 Jupyter Notebook 中展开计时操作,你能采用%time或%%timeit魔法命令。它们都在单行或真个标识符单元中组织工作。

处理数据,大数据甚至更大数据的 17 种策略

%time运行一次,而%%timeit运行标识符多次(默认值为 7)。一定要查看文档,了解其中的微妙之处。

假如你在脚本或 Notebook 中,能导入时间模块,检查运行某些代码前后的时间,并找出差异。

处理数据,大数据甚至更大数据的 17 种策略

在展开试验时间时,请注意不同的机器和软件版本可能会导致差异。假如要重复试验不然,缓存有时候会产生误导。正如所有的实验一样,要尽量保持一切不变。

储存大统计数据

GitHub 的最大文件大小为 100MB 。假如你想采用 GitHub 对大文件展开版本化,你能采用 Git Large File Storage (Git 大文件储存)扩展。

除非你愿意,否则请确保你没有将文件自动上传到 Dropbox、iCloud 或其他自动备份服务。

想了解更多吗?

Pandas 文档中,有关于提高性能和扩展到大型统计数据集的部分。责任编辑其中许多想法就是根据这些章节改编而来。

总结

你已经了解了如何编写更快的标识符,你也了解了如何处置大统计数据和真正的大统计数据。最后,你还了解到了许多新出的库,它们在处置大统计数据各方面可能会继续变得越来越盛行。

我希望责任编辑能够对你有所帮助。

作者介绍:

Jeff Hale,技术撰稿人,撰写统计数据科学相关的文章,如 Python、SQL、Docker 和其他技术主题。并维护统计数据科学资源邮件条目: https://dataawesome.com

原文链接:

https://towardsdatascience.com/17-strategies-for-dealing-with-data-big-data-and-even-bigger-data-283426c7d260

章,私信我“领取资料”,即可免费获得InfoQ价值4999元迷你书!

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务