当前位置: 首页 > article >正文

Julia 中的 One Billion Row Challenge

原文towardsdatascience.com/the-one-billion-row-challenge-in-julia-bdd19cde58d5?sourcecollection_archive---------9-----------------------#2024-06-05如果数据科学家决定接受这个任务他们能学到什么https://medium.com/vikas.negi10?sourcepost_page---byline--bdd19cde58d5--------------------------------https://towardsdatascience.com/?sourcepost_page---byline--bdd19cde58d5-------------------------------- Vikas Negi·发布于 Towards Data Science ·阅读时间 8 分钟·2024 年 6 月 5 日–https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/dded10279fcf25261adbea5aecf60745.png图片来源Indira Tjokorda 在 Unsplash今年早些时候Gunnar Morling 启动了 One Billon Row Challenge自那以后它获得了很大的关注。虽然最初的挑战是使用 Java 完成的但令人惊叹的开源社区随后分享了多种编程语言下的精彩解决方案。我注意到使用 Julia 的人并不多至少没有公开分享过结果所以决定通过这篇文章分享我自己的尝试。我常常想一个问题这个挑战对数据科学家有什么价值除了做一个有趣的练习之外我们能学到更多的东西吗毕竟这个挑战的目标是“简单地”解析一个大型虚拟数据文件计算基本统计量最小值、最大值和均值并以特定格式输出数据。这对于大多数数据科学家通常从事的项目来说可能并不是一个现实的情况。嗯问题的一个方面涉及数据的大小与可用 RAM 之间的关系。在本地工作笔记本电脑或桌面时对大多数人来说难以将所有数据一次性加载到内存中。因此处理比内存更大的数据集成为一项必要的技能这在原型化大数据管道或进行大数据分析/可视化任务时可能会派上用场。原始挑战的规则也指出应该避免使用外部库/包。这迫使你思考新颖的解决方案并为学习语言本身的细节提供了一个迷人的机会。在接下来的文章中我将分享两种方法的结果——使用基础的 Julia 以及通过外部包进行的结果。通过这种方式我们可以比较每种方法的优缺点。所有实验均在配备 AMD Ryzen 9 5900X12 核心24 线程、32 GB RAM 和三星 NVMe SSD 的桌面上进行。Julia 1.10.2 运行在 LinuxElementary OS 7.1 Horus上。所有相关代码可以在这里找到。请注意这里的性能也与硬件有关因此如果你决定在自己的系统上运行脚本结果可能会有所不同。前提条件推荐使用最近发布的Julia版本例如 1.10。对于那些想使用笔记本的人上述仓库还包含一个 Pluto 文件使用该文件需要安装Pluto.jl。挑战的输入数据文件是每个人独特的必须使用这个 Python 脚本生成。请记住该文件大约有 15 GB。python3 create_measurements.py1000000000此外我们还将使用BenchmarkTools.jl包来运行基准测试。请注意这不会影响挑战只是用来收集适当的统计数据以衡量和量化 Julia 代码的性能。使用基础的 Julia输入数据文件measurements.txt的结构如下这里只显示前五行attipūdi;-49.2Bas Limbé;-43.8Oas;5.6Nesebar;35.9Saint George’s;-6.6该文件包含十亿行也称为记录或行。每一行都有一个站点名称后跟分隔符然后是记录的温度。唯一的站点数量最多可达 10,000。这意味着同一个站点会出现在多行中。因此我们需要收集文件中所有不同站点的所有温度数据然后计算所需的统计信息。很简单对吧让我们从简单但慢慢来开始我的第一次尝试是简单地逐行解析文件然后将结果收集到一个字典中每个站名作为键温度作为Float64类型的向量添加到值中。我预期这会很慢但我们的目标是获得基准性能的数字。一旦字典准备好我们就可以计算所需的统计数据所有数据处理的输出需要以某种特定格式显示。以下函数实现了这一点由于这个实现预计需要较长时间我们可以通过仅运行一次time来进行简单的测试timeget_stations_dict_v2(measurements.txt)|calculate_output_v3|print_output_v1output omittedforbrevity526.056399seconds(3.00G allocations:302.881GiB,3.68%gc time)我们这个简单的实现大约需要 526 秒即约 9 分钟。虽然它确实很慢但也并没有那么糟糕升级一下——进入多线程与其一次读取输入文件的一行不如尝试将文件拆分成多个块然后并行处理所有块。Julia 让实现并行for循环变得非常简单。然而在这样做时我们需要采取一些预防措施。在进入循环之前我们首先需要弄清楚如何将文件拆分成多个块。可以通过使用内存映射来读取文件。然后我们需要确定每个块的start和end位置。需要注意的是输入数据文件中的每一行以换行符结尾其字节表示为0x0a。因此每个块应该在该字符处结束以确保在解析文件时不出错。以下函数将块的数量num_chunks作为输入参数然后返回一个数组其中每个元素都是内存映射的块。由于我们从不同的块中解析站点和温度数据我们还需要在最后将它们合并。每个块将首先被处理为字典如前所示。然后我们按如下方式合并所有块现在我们知道如何将文件拆分成多个块以及如何在最后将各个块解析出的字典合并。然而只有在我们能够并行处理这些块时才能获得所需的加速效果。这可以通过for循环来实现。请注意Julia 应该使用多线程启动julia -t 12否则这个解决方案不会产生任何影响。此外我们现在希望运行一个正式的统计基准测试。这意味着该挑战应该执行一定次数然后我们可以可视化结果的分布。幸运的是所有这些都可以通过BenchmarkTools.jl轻松完成。我们将最大样本数限制为 10整个运行的最大时间设为 20 分钟并启用垃圾回收将在样本之间释放内存。所有这些都可以在一个脚本中整合。请注意输入参数现在是文件名fname和数据块数num_chunks。以下是基准测试结果和所用输入。请注意我们在这里使用了 12 个线程。juliaThreads.nthreads()12juliaARGS[measurements.txt,48]2-element Vector{String}:measurements.txt48https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/72ec4e552a082a0938866ae4f1e12de3.png12 个线程数据块数 48图片由作者提供多线程显著提升了性能我们现在的时间大约降至 2 分钟多一点。接下来我们看看还能做什么改进。避免存储所有温度数据到目前为止我们的方法是存储所有的温度数据然后在最后确定所需的统计值最小值、平均值和最大值。然而我们已经可以在解析输入文件的每一行时实现相同的功能。每当找到一个新的值时如果是更大的值则更新最大值或更小的值则更新最小值我们就替换现有的值。对于平均值我们将所有的值相加并保持一个单独的计数器用于记录某个站点的温度出现了多少次。总体而言我们的新逻辑如下所示合并所有结果来自不同数据块的函数也需要相应地进行更新。让我们进行一个新的基准测试看看这个改变是否能改善时间表现。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/03e629680c5f7ea6a82d412a8dfd74b9.png12 个线程数据块数 48图片由作者提供中位数时间似乎有所改善但改进幅度很小。不过依然算是一个胜利更多性能提升我们之前的逻辑用于计算和保存温度的最大值和最小值可以进一步简化。此外按照这个Julia Discourse 帖子中的建议当解析站点名称和温度数据时我们可以使用视图通过view。这一点在 Julia 性能手册中也有讨论。由于我们在解析每一行时使用了切片表达式view帮助我们避免了分配和复制的开销。其余的逻辑保持不变。现在运行基准测试得到以下结果https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/f521124dfe4e634f7f0478fcbea99c64.png12 个线程数据块数 48图片由作者提供哇我们成功地将时间缩短到了接近一分钟。看起来切换到不同的视图确实有很大的影响。也许还有更多的调整可以进一步提高性能。如果你有任何建议请在评论中告诉我。使用外部包仅限使用基础 Julia 进行限制是很有趣的。然而在实际应用中我们几乎总是会使用包因此可以利用现有的高效实现来执行相关任务。在我们的例子中CSV.jl并行解析文件和 DataFrames.jl执行groupby和combine将会派上用场。以下函数执行以下任务使用Mmap读取大文件将文件分割成预定义数量的块遍历这些块使用CSV.read将 12 个线程传递给ntasks并行读取每个块到 DataFrame 中。使用 DataFrame 的groupby和combine获取每个车站的结果将所有 DataFrame 连接起来合并所有分块的结果循环结束后执行一次groupby和combine以获取所有车站的最终结果集。现在我们可以以与之前相同的方式运行基准测试。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/72da5f5c1ebda12a8453bd0ddd76df4a.png12 个线程分块数 48使用外部包图片由作者提供使用 CSV.jl 和 DataFrames.jl 的性能相当不错尽管比我们使用基础 Julia 实现的要慢。在实际项目中这些包是数据科学家工具包中的重要组成部分。因此探索使用这种方法是否可以进行进一步优化将是很有趣的。结论在这篇文章中我们通过 Julia 解决了十亿行挑战。从一个非常简单的实现开始花费大约 10 分钟我们通过对代码的迭代修改成功地大幅提升了性能。最优化的实现可以在约 1 分钟内完成挑战。我确信仍然有改进的空间。作为额外的收获我们学到了一些宝贵的技巧如何处理超出内存的数据集。当使用 Julia 进行大数据分析和可视化时这可能会派上用场。希望你觉得这个练习有用。感谢你的时间可以通过 LinkedIn 与我联系或者访问我的 Web 3.0 网站。参考文献www.morling.dev/blog/one-billion-row-challenge/docs.julialang.org/en/v1/manual/performance-tips/index.html#man-performance-annotations

相关文章:

Julia 中的 One Billion Row Challenge

原文:towardsdatascience.com/the-one-billion-row-challenge-in-julia-bdd19cde58d5?sourcecollection_archive---------9-----------------------#2024-06-05 如果数据科学家决定接受这个任务,他们能学到什么? https://medium.com/vikas.…...

ESP32 Arduino核心开发终极指南:构建专业级物联网控制系统

ESP32 Arduino核心开发终极指南:构建专业级物联网控制系统 【免费下载链接】arduino-esp32 Arduino core for the ESP32 family of SoCs 项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32 还在为物联网项目开发中的硬件兼容性、开发环境复杂…...

Windows电脑运行安卓应用终极指南:APK安装器完整教程

Windows电脑运行安卓应用终极指南:APK安装器完整教程 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经想过,在Windows电脑上直接运行安…...

Redis Sorted Set(有序集合)详解

Redis 里面有一种非常强大的数据结构: Sorted Set(有序集合)简称: ZSet这是 Redis 面试和项目里非常高频的东西。一、什么是 Sorted Set 先记住一句话: Sorted Set 自动排序的 Set它具备: Set 的去重自动排…...

犀牛开发者日记-犀牛论剑特辑 | 李江浩:一个 ROS 布道师的转身

熟悉ROS领域的朋友,对李江浩这个名字想必并不陌生。作为资深ROS布道师,他常年活跃在技术社区分享干货,面对同行提出的各类问题,总能给出快准狠的解决方案,精准直击技术痛点。熟悉他的人都有一个共同感受:李…...

硬件工程师转型软件设计:十大核心技巧与思维转换实战指南

1. 项目概述:一次思维模式的“跨界”升级作为一名在硬件领域摸爬滚打了十多年的老兵,我深知从示波器、烙铁和PCB布线软件转向代码编辑器、版本控制和软件架构图时,那种既兴奋又迷茫的感觉。硬件工程师转软件设计,这绝不仅仅是换个…...

Midscene.js实战指南:3步构建跨平台AI自动化测试,效率提升70%

Midscene.js实战指南:3步构建跨平台AI自动化测试,效率提升70% 【免费下载链接】midscene AI-powered, vision-driven UI automation for every platform. 项目地址: https://gitcode.com/GitHub_Trending/mid/midscene 在当今多平台应用生态中&am…...

从U盘启动OpenWRT:零门槛打造你的x86软路由实验平台

1. 为什么选择U盘启动OpenWRT软路由? 去年我帮朋友改造旧笔记本时,偶然发现用U盘跑OpenWRT简直是个宝藏方案。相比直接刷入硬盘,U盘启动有三大不可替代的优势:零成本实验、无损体验和随身携带。你完全可以用吃灰的旧U盘&#xff0…...

告别内存泄漏!LabVIEW调用Halcon后必须做的资源释放操作(附HImage、HWindow关闭方法)

LabVIEW与Halcon混合编程中的资源管理实战指南 在工业自动化检测领域,LabVIEW与Halcon的结合堪称黄金搭档——前者提供灵活的流程控制,后者拥有强大的图像处理能力。但许多工程师在开发长期运行的视觉系统时,常常遇到一个隐形杀手&#xff1a…...

C-Eval:中文大模型能力评估的“高考”与诊断工具

1. 项目概述:为什么我们需要一个“中文大模型高考”?最近两年,大模型的热度居高不下,各种评测榜单也层出不穷。但不知道你有没有发现一个现象:很多号称在某某英文评测集上“刷”到SOTA(State-of-the-Art&am…...

WinSW实战:除了开机自启,这样配置还能监控你的Nacos服务状态与日志

WinSW进阶实战:构建Nacos服务的全方位监控体系 对于许多使用Nacos作为注册中心和配置中心的团队来说,确保其稳定运行是系统可靠性的基石。虽然通过WinSW将Nacos注册为Windows服务并实现开机自启解决了基础问题,但真正的挑战在于服务运行后的状…...

能碳数据治理与建模引擎:MyEMS 开源方案打造企业能源管理数字底座

在企业数字化转型的深水区,能源数据正从分散的报表附件演变为支撑经营决策的核心资产。然而,多数企业的能源数据仍面临采集标准不一、存储格式杂乱、分析口径各异等现实困境,数据治理成为能源管理升级的首要门槛。当双碳战略进入精细化实施阶…...

扛住十万并发的“冷面保安”:一文扒透限流的四大经典算法与代码实战

在高并发架构中,如果说缓存和 MQ 是替服务器扛伤害的“防弹衣”,那么限流(Rate Limiting)就是守在系统大门外的“冷面保安”。他的核心逻辑极其冷酷:不管外面排队的人有多急,只要超过了系统的最大接待能力&…...

iTop实战指南:3个关键挑战与ITSM平台架构优化策略

iTop实战指南:3个关键挑战与ITSM平台架构优化策略 【免费下载链接】iTop A simple, web based CMDB & IT Service Management tool 项目地址: https://gitcode.com/gh_mirrors/it/iTop 在数字化转型浪潮中,企业IT服务管理面临配置信息分散、…...

如何扛住十万级流量洪峰?扒开高并发架构的五层防御体系

在互联网的残酷战场上,流量既是黄金,也是洪水。试想这样一个场景:你们公司花重金请了一位顶流代言人,晚上 8 点准时开启一场“一元秒杀”活动。时间一到,原本平时只有几百 QPS(每秒请求数)的系统…...

NAS如何变身创作利器?基于绿联DX4600 Pro自建图床与Typora无缝协作

1. 为什么选择NAS自建图床? 作为一名长期使用Markdown写作的内容创作者,我深知图片管理的重要性。过去三年我先后尝试过七牛云、又拍云等第三方图床服务,虽然费用不高(每月约5-10元),但经常遇到两个致命问题…...

如何用韭菜盒子打造你的VSCode投资信息中心:5大实用功能深度体验

如何用韭菜盒子打造你的VSCode投资信息中心:5大实用功能深度体验 【免费下载链接】leek-fund :chart_with_upwards_trend: 韭菜盒子VSCode插件,可以看股票、基金、期货等实时数据。 LeekFund turns your VS Code and Cursor into a real-time stock, fun…...

新手避坑指南:用CCS10和LaunchXL-F28379D点亮第一个LED(GPIO输出两种方法详解)

从零点亮LED:LaunchXL-F28379D开发板GPIO实战避坑手册 刚拿到LaunchXL-F28379D开发板时,那种既兴奋又忐忑的心情我至今记忆犹新。作为TI C2000系列中的明星产品,这块板子强大的DSP性能与丰富的外设令人跃跃欲试,但面对密密麻麻的英…...

互联网大厂 Java 求职面试全景:从音视频场景到微服务架构的深入探讨

互联网大厂 Java 求职面试全景:从音视频场景到微服务架构的深入探讨 在互联网大厂的招聘中,Java 开发者的面试不仅技术含量高,还充满了戏剧性。今天,我们将通过一位求职者燕双非与面试官的对话,带你走进这个复杂而有趣…...

i.MX6Q烧录翻车实录:从‘No Device Connected’到‘Push error’,我拔掉一个USB WiFi才搞定

i.MX6Q烧录实战:当USB设备冲突遇上OTG接口的排查指南 那天下午的阳光透过窗户斜射进实验室,我正对着i.MX6Q开发板进行例行固件更新。Mfgtools工具已经准备就绪,开发板电源接通,一切看起来都很完美——直到屏幕上跳出那个令人沮丧…...

知识库搭建:从认知到实践的完整指南

知识库搭建:从认知到实践的完整指南一、先搞清楚:什么是知识? 数据 → 信息 → 知识 → 智慧 是经典的 DIKW 金字塔,描述了认知逐层升维的过程:层级核心定义关键特征回答的问题示例数据原始事实,raw facts离…...

1951-2025年中国1km月平均气温逐年年内季节波动幅度数据集

中国1000米分辨率月平均气温数据集(1951-2025)提供了长时间序列、规则网格的气象背景信息,为开展气候变化分析和区域比较研究提供了基础数据支撑。针对原始月尺度序列直接使用不够便捷的问题,需要进一步形成具有明确主题和统一格式…...

3分钟解决游戏操作冲突:Hitboxer SOCD工具让你的键盘操作职业化

3分钟解决游戏操作冲突:Hitboxer SOCD工具让你的键盘操作职业化 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 你是否在玩《街头霸王6》时连招总是失败?或者在《Apex英雄》中急停转向时…...

AI 落地精准测试平台:从排障定位、回归决策到智能分析实战课系列导航

本目录沉淀了一套围绕“采集接入、报告分析、治理沉淀、智能运维”展开的教学文章系列。 共 120 篇,适合拆分发布,也适合按专题连续阅读。 AI 落地精准测试平台:从排障定位、回归决策到智能分析实战课 这套系列适合谁 测试工程师&#xff…...

VBS转VBE不只是加密:聊聊Scripting.Encoder的‘黑历史’与现代替代方案

VBS转VBE:从Scripting.Encoder的兴衰到现代脚本保护方案 在Windows脚本技术的发展长河中,VBScript(VBS)曾经是自动化任务和系统管理的重要工具。而与之相伴的VBE(VBScript Encoded)格式,则承载着…...

为什么你的Perplexity薪资查询总返回403?3类Token权限陷阱+2种合法绕行路径(含Postman配置模板)

更多请点击: https://intelliparadigm.com 第一章:为什么你的Perplexity薪资查询总返回403?3类Token权限陷阱2种合法绕行路径(含Postman配置模板) 当你调用 Perplexity 提供的薪资数据 API(如 /v1/salari…...

OpenHarmony与嵌入式Linux实战:从社区项目到深度开发指南

1. 项目概述:从社区精选到深度解析每周浏览技术社区,总能看到不少让人眼前一亮的项目分享,但信息往往比较零散,像是“嵌入式学习资料包”、“OpenHarmony挑战赛作品赏析”这类帖子,标题很吸引人,点进去却常…...

拯救吃灰的MT7921网卡:保姆级教程,在Ubuntu 22.04上为联想拯救者系列驱动Wi-Fi

拯救吃灰的MT7921网卡:联想拯救者Ubuntu 22.04无线驱动全攻略 当联想拯救者Y9000P/R7000P等2021款笔记本遇上Ubuntu 22.04,那块被诟病已久的MT7921无线网卡往往成为最大的绊脚石。不同于Windows下的即插即用,Linux环境需要精准的内核版本与固…...

从仿真到现实:用Unity+ROS2搭建激光雷达小车,为实体机器人开发做预演

从仿真到现实:用UnityROS2搭建激光雷达小车,为实体机器人开发做预演 在机器人开发领域,仿真环境正逐渐成为不可或缺的工具。想象一下,你可以在不购买任何硬件的情况下,验证复杂的导航算法;或者在投入大量资…...

BiliDownloader实战演练:解锁B站视频离线观看的智能解决方案

BiliDownloader实战演练:解锁B站视频离线观看的智能解决方案 【免费下载链接】BiliDownloader BiliDownloader是一款界面精简,操作简单且高速下载的b站下载器 项目地址: https://gitcode.com/gh_mirrors/bi/BiliDownloader 你是否曾为无法下载B站…...