ArcticDB 上的 10 亿行挑战 (1BRC)

ArcticDB

2024 年 8 月 22 日

1*cpX1MZR 4I1L4sLMwx0CuQ

挑战

10 亿行挑战是一项于 2024 年 1 月举行的技术竞赛。

目标是读取和聚合一个 CSV 文件,其中每一行包含一个特定气象站的温度数据。代码必须用 Java 编写

目标是输出每个气象站的最低、平均和最高温度。

项目包含一个示例文件,其中包含 413 个气象站的数据。还包含用于生成具有 10 亿行数据的 10,000 个气象站随机数据的代码。

提交了许多参赛作品。获胜作品仅用时 1.5 秒多一点完成了挑战。其他参赛作品用时最长达 4 分钟。

您可以在此处阅读有关原始挑战的更多信息:https://github.com/gunnarmorling/1brc

使用 ArcticDB 迎接挑战

我们决定保留原始挑战的精神,但对其进行了调整,以使用 ArcticDB 来完成繁重的工作。

假设

  • 我们将使用 Python 和 ArcticDB 进行数据处理

  • 我们将使用 lmdb 作为 ArcticDB 后端,它将数据存储在本地文件系统上

  • 我们不将数据创建和写入的时间计入挑战时间——只计算读取和聚合的时间——这与原始 Java 测试相同。

步骤

  • 创建一个 ArcticDB 对象存储和库

  • 生成数据并将其写入库中的一个符号

  • 使用聚合函数 min、max 和 mean 查询每个城市

  • 数据通过 query_builder 参数作为 read 的一部分进行聚合

  • 这将使用 C++ 线程并发处理任务中 IO 密集型和 CPU 密集型的部分

  • 输出是聚合后的数据

总结

  • 所有这些仅用不到 50 行易于理解的 Python 代码即可完成

  • 有关如何使用 ArcticDB 的笔记本和相关文档链接可在文章末尾找到

  • 大部分代码用于设置和数据创建

  • 实际的读取和聚合代码仅有 2 行

性能如何?

在配备 14 核和 64GB RAM 的 Dell XPS15 笔记本电脑上运行,挑战用时 7.2 秒。

在配备 64 核和 512GB RAM 的更强大机器上运行,用时 4.1 秒。

这相当于“10k”挑战,可在此处找到挑战的可比结果:1brc 10k results。结果范围从 3 秒到 23 秒。

因此,我们创建了一个解决方案,仅使用几行高级 Python 代码,其性能可与手动优化的 Java 代码相媲美。

试着看看 1BRC github 中挑战中运行最快的解决方案代码,你会很快意识到这种代码只有低级代码优化方面的专家才能写出来,即使对于专家来说,这种编码也需要多次分析和改进才能获得最佳性能。

使用 ArcticDB 时,您站在我们工程师团队的肩膀上,他们拥有丰富的专业知识,并通过我们简单的 Python API 将这一切提供给您。笔记本中有一行代码可被视为性能调优——设置

rows_per_segment
使其大于我们的默认值。

为了说明 ArcticDB 如何利用可用的多核,我们使用了不同数量的线程进行运行。结果如下表所示

1*W4KZ61OqhpuY qbUMk6Lig

您无需担心这一点。ArcticDB 可以检测您的机器有多少核心,并且会使用所有核心,除非您像笔记本中所示那样对其进行限制。

另一个版本经过修改,将读取/聚合步骤分块以适应可用内存,在免费的 Google Colab 上运行需要 2 分钟。您可以在底部的笔记本链接末尾找到它。

在测试此挑战期间,我们发现了一些未来可以进一步改进 C++ 引擎性能的领域。我们预计未来速度还会进一步提高。

结论

我们很高兴使用 ArcticDB 能够达到接近精心编写的手动优化代码的性能。

请按预期理解这些结果——我们并不是声称已经解决了挑战本身,而只是使用 ArcticDB 解决了相同的问题。

我们没有在基础调优之外进行额外的性能调优。我们希望保持代码简单易读,以展示使用 ArcticDB 高效解决各种问题是多么容易。

如何了解更多信息?

链接至