用于大数据处理的Rust:比Python更快地处理百万行数据

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么Rust是大数据处理的新王者?

\n\n

你是否曾等待20分钟,只为让Python脚本处理一个10GB的CSV文件?然后又等了10分钟,因为内存耗尽,系统开始使用交换空间?熟悉吗?

\n\n

大数据世界长期以来属于Python及其生态系统:Pandas、NumPy、Dask。但有一个问题——Python很慢。非常慢。当数据量达到TB级别时,每多一毫秒都会变成数小时的停机时间。

\n\n

这时,Rust登场了。这是一种系统级语言,提供C++的性能和内存安全,但语法(剧透一下)相当讨人喜欢。是的,它非常适合大数据处理。

\n\n

在本文中,我们将探讨Rust如何更快、更安全、更省内存地处理海量数据。没有魔法——只有代码和实测数据。

\n\n

Rust vs Python用于大数据:内部机制如何?

\n\n

让我们直接看数据。这是一个简单的测试:读取一个500MB的CSV文件,按条件过滤行,并计算总和。

\n\n\n\n\n\n\n
参数Python (Pandas)Rust (Polars)
执行时间12.4秒0.8秒
峰值内存占用2.1 GB380 MB
行数500万500万
\n\n

速度快了15倍,内存节省了5倍。这还不是极限。Rust让你控制每一个字节、每一次内存分配。它不容忍错误,但提供了Python永远无法企及的速度。

\n\n

Rust用于大数据的工具集

\n\n

在编写代码之前,让我们看看有哪些可用工具。Rust并未停滞不前——其数据处理生态系统正在蓬勃发展。

\n\n

主要库

\n
    \n
  • Polars——类似Pandas,但基于Rust。支持惰性计算、并行处理,并能处理超出内存的数据。
  • \n
  • Apache Arrow——列式数据格式,允许在不同语言之间无复制地交换数据。
  • \n
  • DataFusion——基于Rust的SQL引擎,能够直接在Arrow数据上执行查询。
  • \n
  • rayon——用于并行迭代的库。可以轻松并行化任何处理任务。
  • \n
  • csv——快速CSV文件解析器,内存分配极少。
  • \n
  • serde——序列化/反序列化。处理JSON、YAML、TOML时必不可少。
  • \n
\n\n

我们将使用Polars和rayon,因为它们实际上是Rust大数据处理的标准。

\n\n

实战示例:处理Web服务器日志

\n\n

假设你有1亿条Nginx日志记录。需要:

\n
    \n
  1. 仅过滤出5xx错误
  2. \n
  3. 按IP地址分组
  4. \n
  5. 计算每个IP的错误数量
  6. \n
  7. 输出前10个恶意IP
  8. \n
\n\n

使用Python和Pandas,这大约需要2-3分钟,并耗尽所有内存。而使用Rust,只需15-20秒。

\n\n

数据结构

\n

假设每条日志如下所示:

\n
192.168.1.1 - - [10/Oct/2023:13:55:36 +0000] "GET /api/data HTTP/1.1" 500 1234 "-" "Mozilla/5.0"
\n\n

我们需要解析字符串,提取IP和状态码。在Rust中,通过自定义结构体类型实现:

\n\n
use serde::Deserialize;\n\n#[derive(Debug, Deserialize)]\nstruct LogEntry {\n    ip: String,\n    status_code: u16,\n    method: String,\n    path: String,\n    user_agent: String,\n}
\n\n

使用Polars解析CSV

\n

Polars是值得尝试Rust的理由之一。

博客

书籍推荐