写点什么

十亿行挑战显示 Java 可以在两秒钟内处理十亿行的文件

作者:Olimpiu Pop

  • 2024-02-24
    北京
  • 本文字数:2043 字

    阅读完需:约 7 分钟

十亿行挑战显示 Java 可以在两秒钟内处理十亿行的文件

2024 年的第一天,Decodable 高级软件工程师 Gunnar Morling 向 Java 社区发起了 十亿行挑战(1BRC)。这项挑战将持续到 1 月底,目标是找到在最快时间内处理 10 亿行的 Java 代码。到目前为止,最快的算法可以在 2.5 秒内完成处理。



挑战的规则很简单:只能使用 SDK 特性,可以是任何 Java 发行版。因此,解决方案中不能借助外部库或数据存储。为了更好地了解这一挑战,InfoQ 联系了 Morling、GoTo 首席软件工程师 Eliot Barlas、OpenValue Rotterdam 总监 Roy van Rijn 以及 Oracle 软件开发副总裁兼 GraalVM 创始人 Thomas Wuerthinger。


InfoQ:这是一项令人兴奋的挑战。您能描述一下吗?其背后的动机是什么?


Morling:1BRC 是一项编码挑战,它的任务看似简单:解析文本文件中的温度测量值,并确定每个气象站的最小、最大和平均温度。需要注意的是:该文件有 10 亿个条目!


我想创造一个机会来探索高性能编程技术、新引入的 API(比如 Vector API——它利用了 CPU SIMD 指令)、不同 Java 发行版的特性,以及任何能证明 Java 已经变得非常快的东西。


InfoQ:如何参与这项挑战?


Morling: 可以先看下README文件,并克隆存储库。尝试实现自己的解决方案,并看看其他人做了什么尝试——归根结底是为了学习。


InfoQ:您在解决方案中有看到什么出人意料的东西吗?


Morling: 有人采用了黑客的做法:许多解决方案针对特定的键集合(即天气预报站名称)做了优化。这对于这个特定的数据集是有效的。在社区的帮助下,我们澄清了挑战的目的。


有许多解决方案很有趣:使用 SIMD 和新特性 Java 原生内存 API(这是我希望看到的),以及高度优化的解析函数,包括 SWAR(寄存器内 SIMD),这是我没有预料到的。到目前为止,致力于实现最快算法的人们已经深入到原生优化领域,计算 CPU 指令,评估分支预测错误等。


InfoQ:请描述下您的解决方案。有什么技术是您想要尝试的吗?


Eliot Barlas:我的解决方案是按照可用处理器的数量拆分文件。对于每一个部分,都有一个任务在单独的线程上计算每个气象站的统计信息。当这些任务完成后,最终结果将汇总到最终的统计数据表中。


对每一部分中的数据做内存映射,并通过可以覆盖整个分区字节范围的MappedByteBuffer进行访问。任务会使用ByteBuffer遍历分区中的数据,每次一个 byte 或 int。我还使用sun.misc.Unsafe将气象站名称提取并存储为整数序列。


Roy van Rijn: 我的解决方案是一种渐进式的解决方案。一开始,它使用 SDK 提供的普通数据结构和 API(如BufferedInputStreamHashMap)。逐步地,它演变成使用 Unsafe 来直接访问内存。并行性、无分支代码和实现 SWAR(SIMD 作为寄存器)使我的解决方案成为迄今为止最主要的竞争者之一。对于存储,我自己实现了一个“非常简单”的 hashmap,其底层是基于线性探查概念的数组。


Thomas Wuerthinger: 该解决方案的第一部分将工作负载按照目标处理器的可用核数进行划分,以便可以并行处理。它使用 Java 的特性对输入文件做内存映射,从而实现最有效的直接内存访问。解析数据的最内层循环所采用的技术设法避免了分支代码,代之以一些复杂的算术和位操作。对于这个特定的问题,由于输入的随机性,处理器经常会做出错误的分支预测,因此避免分支是最大化性能的关键。


InfoQ:您的解决方案还有可能进一步改进吗?


Barlas: 我一直在关注 Panama 项目,但 1BRC 提供了一个以应用方式探索外部内存能力的机会。[…] 我还未能成功地利用 Panama 项目的 Vector API 实现加速。例如,开始时,我尝试使用 ByteVector API 来快速比较气象站名称。我想使用其他类型的向量或结合 MemorySegment 接口重新实现这个过程。


Wuerthinger: 现在可能的改进在很大程度上取决于目标硬件。具体来说,可以在内存带宽、计算带宽和分支预测依赖方面进行权衡。


Roy van Rijn: 从大的方面来讲,方法是类似的。我目前正在尝试探索的概念是“机械同情(mechanical sympathy)”,我希望改进需要执行的指令,让它们以一种最适合测试机器的方式执行。


InfoQ:您怎么看新年伊始的这项有趣的挑战?


Morling: 可以肯定的是,Java 及其生态系统和社区比以往任何时候都更加繁荣!看到这么多人参加挑战,包括一些非常知名的开发者,真是令人鼓舞。每个人都在学习:要么通过编码,要么通过阅读代码。能有这么多人参加这项挑战,实在是离不开社区的帮助。


这一挑战受到了程序员社区的热烈欢迎,Morling 说,“这一切都远远超出了我的预期。”尽管领跑者似乎是在 GraalVM 上运行的解决方案,但也有提交使用了 OpenJDK 构建、Amazon Corretto 或 Eclipse Temurin。Morling 进一步评论说:“Graal 非常适合眼下这项任务,可以额外提供几个百分点的性能提升。”


这个挑战已经不限于 Java 生态系统,已经有使用 Rust、Go、C++ 甚至 SQL 和 Shell 编写的解决方案。


Morling 感谢了社区和 Decodable——他们提供了评估用的机器。


原文链接

https://www.infoq.com/news/2024/01/1brc-fast-java-processing/



欢迎加入 InfoQ 读者技术交流群,与志同道合的朋友一起探讨知识,交流经验。


2024-02-24 08:009257

评论 3 条评论

发布
用户头像
如何使用.NET在2.2秒内处理10亿行数据(1brc挑战)https://www.cnblogs.com/InCerry/p/17964592/7-1brc-in-dotnet-even-faster-than-java-cpp
2024-02-24 20:54 · 广东
回复
.NET比 Java快多了
2024-02-24 20:54 · 广东
回复
Java 的优点是因为快嘛?
2024-02-28 16:30 · 广东
回复
没有更多了
发现更多内容

关于MYSQL引擎在物理层面存储那些事

谐云

用于共享大文件的4种大文件传输工具和软件

镭速

大文件传输软件

【您的意见很重要】天翼云文档“找茬”活动

天翼云开发者社区

云计算

支付宝小程序云云测产品最佳实践

TRaaS

支付宝小程序 支付宝 IoT

MES系统可解决方案

万界星空科技

MES系统

Redis:揭秘高效缓存与数据存储利器

互联网工科生

redis 数据结构 数据存储

Apache Paimon 流式数据湖 V 0.4 与后续展望

Apache Flink

大数据 实时计算

智慧云 打造您的商城APP,与5G时代社交电商融为一体

知者如C

直播|深入解析 StarRocks 存算分离--云原生湖仓 Meetup#2

StarRocks

数据库 云原生 存算分离 国产数据库 湖仓一体

基于卷积神经网络的MAE自监督方法

华为云开发者联盟

人工智能 华为云 华为云开发者联盟 企业号 8 月 PK 榜

涛思数据联合长虹佳华、阿里云 Marketplace 正式发布 TDengine Cloud

TDengine

tdengine 阿里云 时序数据库

探索未知,即刻搭建AI原生应用!WAVE SUMMIT Workshop等你来参加

飞桨PaddlePaddle

人工智能 百度飞桨 百度AI WAVE SUMMIT

AirServer 7 for Mac(Mac专用投屏工具) v7.2.6激活版

mac

AirServer 投屏软件 苹果mac Windows软件

软件研发的道德情操

阿里技术

研发 软件研发

GaussDB(DWS)函数不同写法引发的结果差异

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 8 月 PK 榜

传统企业的智能化IPD(产品集成开发)转型

禅道项目管理

目前国内市场知名的可视化工具(2D/3D)

2D3D前端可视化开发

可视化 数据可视化 三维可视化 可视化工具 组态可视化

文心一言 VS 讯飞星火 VS chatgpt (74)-- 算法导论7.2 2题

福大大架构师每日一题

福大大架构师每日一题

环路检测在风控领域的应用实践丨 Fabarta 技术专栏

Fabarta

大数据 算法 图分析 智能风控 风控算法

断点重传、错误自动重传,优秀的文件传输工具应该具备这些特性

镭速

文件传输 文件传输工具

基于Java开发的拿来即用的EHR系统

金陵老街

Java Vue 低代码

基于大模型的数据血缘异常归因分析

奇点云

元数据 黑客马拉松 奇点云 对象体系

为什么我们会对中国软件行业如此悲观?

ToB行业头条

Pixologic ZBrush 2023 for Mac(三维数字雕刻软件)v2023.2.2中文版

mac

苹果mac Windows软件 Pixologic ZBrush 2023Z 数字雕刻软件

大模型时代下的我们,破茧重生探索新开发范式!|WAVE SUMMIT 开源论坛

飞桨PaddlePaddle

人工智能 百度 开发者 百度飞桨 WAVE SUMMIT

如何选择适合自己的文件传输工具

镭速

文件传输 文件传输工具

与传统IT开发相比,低代码开发具备哪些优势?

互联网工科生

低代码 应用开发 私有化部署 可视化引擎 JNPF

情景规划与财务建模2.0,如何促进企业全面预算管理的实施

智达方通

智达方通 全面预算管理 财务建模 情景规划

一种基于Nginx的热点数据调度处理方法

天翼云开发者社区

大数据

SpringBoot+Vue3打造企业级一体化PaaS系统

高端章鱼哥

Vue PaaS spring-boot JNPF

十亿行挑战显示 Java 可以在两秒钟内处理十亿行的文件_编程语言_InfoQ精选文章