小红书离线数仓提效新思路,提升百倍回刷性能

数据处理效率一直是大数据时代的核心话题,它推动着各类数据执行引擎持续迭代产品。从早期的 MapReduce,到今天的 Spark,各行业正不断演进其离线数仓技术架构。

现有以 Spark 为核心的数仓架构在处理大规模数据回刷方面已取得进展,但在资源和时间消耗上仍面临挑战。为了突破这些限制,小红书数据仓库团队将 StarRocks 融入到离线处理流程,替换掉部分 Spark 处理的任务,并优化较为耗时的 Cube 计算,大幅度提高了数据的执行效率。

实践证明,经过改造的离线处理链路,可以有效降低任务资源消耗,提前数据产出时间。将作业执行时间从小时级压缩至分钟级,计算资源使用量降低 90% 以上,日数据产出时间提前 1.5 小时,回刷时间减少 90%,回刷成本减少 99% 以上。

图片

图片

为了更好地管理和使用数据,离线数仓一般会通过分层设计,确保数据高效利用。

  • ODS 层(操作数据存储层):收集来自客户端和服务端数据的原始日志。其中,服务端数据存储结构与线上表结构保持一致。

  • DWD 层(事实明细层):ODS 层数据在此层进行清洗和整合,经历必要的数据转换和计算,从而形成一个详细的、一致的、历史的和集成的数据集。

  • DWS 层(数据聚合层):该层汇总 DWD 层数据,分为轻度汇总和汇总。轻度汇总维度较多,便于上卷,形成汇总层。数据一般为当天的计算或加总。

  • DM 层(数据宽表层):这一层有确定的核心实体或者场景,可能跨数据域。根据业务需求,基于某个分析主题进行数据加工,对 DWS 层数据进一步地加工处理,形成各种丰富的数据模型。与 DWS 层的主要区别在于:度量值中是否包含“一天以外的加工数据”,如近 7 日,近 30 日,近 90 日等多日聚合指标。

  • APP 层(数据应用层):在这里,DM 层的数据结果会被转化为直观的报表、动态的大屏、和便捷的数据服务,以支持决策和业务洞察。为了提升查询效率,数仓会预先计算 Cube(即不同维度组合下的指标),将其存储在表中。

  • DIM 层(公共维度层):这一层用于存储各类实体的维度数据,为数据分析提供多角度的视野。

离线数仓一般以 Spark 引擎作为主力,它负责数据的清洗、关联和聚合,完成所有数据模型的建设。随后,通过 DTS 任务将 APP 层的数据导入到 OLAP 集群中。小红书主流的 OLAP 引擎包括 StarRocks 和 ClickHouse,它们凭借 OLAP 引擎的查询能力,为数据产品、分析看板和业务工具提供数据查询服务。

图片

虽然 Spark 引擎以其强大的吞吐量和稳定性在离线数仓中被广泛使用,但它在数据查询优化方面存在局限。Spark 并不直接管理数据的分布、存储格式或元信息,无法结合数据存储格式和数据元信息进行查询优化。此外,为了确保稳定性,Spark 在跨节点数据传输时需要将数据写入磁盘,这在大规模数据回刷时会导致资源消耗巨大和处理周期延长。

从本质上来看,Spark 仅仅是一个数据处理引擎,而不是一个理想的数据仓库分析引擎。在实际应用中,这种性能瓶颈尤为明显,开销较大。例如,以交易运营行业为例,若要回刷两年的数据,则需要占用相当于 7 万台机器近 30 天的资源,成本高达上百万元。这种定期数据回刷产生的巨额成本,已经成为数据仓库团队不得不面临的问题。

图片

与 Spark 这类数据处理引擎不同,基于 MPP 架构的 OLAP 引擎在数据查询方面是更具优势的。市面上常见的 OLAP 引擎主要有两个:ClickHouse 和 StarRocks。

ClickHouse 是一个开源的列式数据库管理系统,可用于 OLAP 分析。它采用列式存储,与传统的行式存储相比,这种设计在处理分析型查询时更为高效,因为它能够快速读取和聚合列数据,无需加载整个行。ClickHouse 的 MPP 架构允许查询任务被拆分为多个子任务,并在集群的多个节点上并行执行。每个节点都配备独立的的处理器和存储资源,使得系统能够充分利用集群的计算和存储能力,大幅提升查询速度和系统吞吐量。此外,ClickHouse 的 MPP 架构还支持数据复制和分片,提高数据的可用性和查询性能。即使某个节点发生故障,其他节点也能迅速接管任务,确保服务的连续性。ClickHouse 是用 C++ 编写的,它在单核性能上进行了深度优化。

StarRocks 也是一款高性能分析型数据仓库,可实现多维、实时、高并发的数据分析。StarRocks 采用了向量化、MPP 架构、CBO 优化器、智能物化视图和列式存储引擎等先进技术,因此与同类产品相比,在查询效率上具有较大优势。StarRocks 能够高效地从各类实时和离线数据源导入数据,并直接分析数据湖中的多种格式数据。StarRocks 兼容 MySQL 协议,常用 BI 工具能轻松接入。此外,StarRocks 支持水平扩展,确保了高可用性、可靠性和易于维护。

在小红书内部,StarRocks 版本以存算一体架构为主,其中前端(FE)负责元数据管理和构建执行计划,而后端(BE)则负责数据存储和计算。这种架构使得查询能够直接在 BE 节点上本地执行,避免数据传输与拷贝开销,从而实现极速的查询分析性能。存算一体架构还支持数据的多副本存储,提升了集群在高并发环境下的查询能力和数据可靠性。

图片

StarRocks 对算子和函数进行了向量化加速,并通过 Pipeline 调度框架,充分利用多核计算能力,提升查询性能。虽然 StarRocks 和 ClickHouse 在单表查询性能上相近,但 ClickHouse 在查询并发和不支持分布式 Join 的局限性,使其不适合作为生产数仓模型的查询加速引擎。因此,我们选择了 StarRocks 替换原有的 Cube 计算,期望在数据处理和分析方面达到更高的性能和效率。

图片

图片

为了提升离线数仓的产出效率,我们对架构进行如下优化:

  • 直接导入:将 DM 表、DWS 表和常变维度的 DIM 表直接导入 StarRocks 中,简化数据处理流程。

  • Cube 表建模:在 StarRocks 中完成计算密集型的 Cube 表建模,以提高数据处理速度。

计算 UV 的一般方式是使用 count distinct ,它能够保留原始数据的明细,有较高的灵活性。然而,由于在查询执行的过程中需要进行多次 shuffle(跨节点通过网络传输数据),会导致查询性能随着数据量增大而直线下降。

以下面的 SQL 为例,示例 1 :

其执行过程中,首先会构建一个中间表 tb1,并扩展出三个虚拟维度:c1、c2 和 c3。

  • c1:  if(buy_num>0, user_id,null)

  • c2:  if(imp_num>0, user_id,null)

  • c3:  if(click_num>0, user_id,null)

因为有三个 count distinct 的维度,数据也会扩展为三倍。随后经历三轮 shuffle 才能得出结果。该过程中数据会膨胀,因此 shuffle 的数据量会比较大。

图片

针对 Cube 表中的 id 消重指标,如用户数、商品数等,我们采用了 BitMap 技术。BitMap 基本原理是用一个 bit 位来标记某个元素对应的 Value,而 Key 即是该元素。与传统的 count distinct 方法相比,BitMap 消重在空间和时间上都显示出显著优势:

  • 空间优势: BitMap 通过一个 bit 位标记 id 的存在,可看作是对一个集合的压缩结构,大幅减少了存储需求。比如对 int32 去重,使用普通BitMap 所需的存储空间只占传统去重的 1/32。StarRocks 采用的 Roaring Bitmap,能进一步降低稀疏数据的存储空间。

  • 时间优势: BitMap 去重的计算操作,分为对给定下标的 bit 置位和统计 bitmap 的置位个数,时间复杂度分别为O(1)和O(n),且后者可使用 clz、ctz 等指令高效计算。此外, BitMap 去重技术在 MPP 执行引擎中还可以并行加速处理,每个计算节点独立地生成其对应的子 BitMap,然后通过 bitor 操作高效地将这些子 bitmap 合并为一个完整的去重结果。与传统的基于排序(sort)或哈希(hash)的去重方法相比,bitor 操作不仅减少了数据的无条件依赖和依赖关系,还能够实现向量化处理,从而大幅提升去重操作的效率和性能。

BitMap 大小取决于最大 id 值,直接关系到查询的稳定性和性能。StarRocks内置的编码函数能够将字符串类型的 id 转换为 64 位的数字 id,但这样的转换可能导致生成的数字 id非常大,影响性能和稳定性。为了解决这个问题,我们引入了编码表,它的作用是将字符串 id 映射到一个更小范围的数字 id,随后我们把数字 id 转化为 BitMap。

编码表的逻辑类似于数据库的自增逻辑,即首个 id 对应的数字是 1,后续每新增一个 id,对应的数字 id 就自增 1。从而保证每个字符串 id 都会拥有一个唯一的数字 id,也有效缩小了 BitMap 占用的存储。

那么经过 BitMap 改造的任务,示例 1 中的 SQL 执行过程就变成了下图的执行过程。shuffle 数据量等于原表数据量,并且只需要一轮 shuffle。

图片

使用过程中,Cube 计算会占用大量的 CPU 资源和内存资源。在我们的应用场景中,需要处理的 Cube 数量多达上百个,这对 StarRocks 来说,经常会导致内存溢出(OOM)的情况。StarRocks 在执行 SQL 查询时,一般会将所有数据置于内存中,且计算过程中的数据不会 Spill 到磁盘上。为解决资源瓶颈这一问题,我们从两个方面进行了优化:

  • 控制 DM 表和 DWS 表的规模,这包括控制表的行数、列数、以及单字段大小;可有效减少数据表展用的资源。

  • 优化 SQL 写法。Cube 计算的核心原理是将数据扩展为 n 份(由 Cube 的数量决定),然后进行聚合操作。为了减少在扩展过程中产生的数据量,我们根据集群的规模和能力,将复杂的 SQL 查询拆分成多个较小的批次。通过分批次提交这些查询,巧妙地利用时间来换取所需的计算空间,从而避免了一次性处理大量数据导致的资源不足问题。

图片

为了提升查询效率,数据仓库通常会在 APP 层创建多个 Cube,从一张宽表派生出多个针对不同业务场景的 Cube 表。这些 Cube 表虽然优化查询效率,但并不承担指标定义的功能。在不降低查询效率的前提下,StarRocks 提供了物化视图简化数据模型。物化视图本质是预先计算并存储在 StarRocks 中的数据,它对用户透明,在查询时自动将请求重定向到已计算好的数据集,从而减少了数据处理量并加快了查询速度。

例如,如下图所示,未使用物化视图的查询(左侧)需要从基础底表中提取数据,而启用物化视图后(右侧),查询直接访问优化后的数据,物化视图的数据是底表数据关联聚合而来,可以显著减少数据量和提升查询速度。

图片

对于离线数据的物化视图,一般为定时调度,其调度类似于天级离线任务,因此其调度不会对资源造成过多占用。

在数据产品中,用户的查询往往遵循一定规则、灵活度受制于产品,这为物化视图提供了优化的机会。所有依赖同一张宽表的指标都可以通过物化视图得到加速,而无需在多个表中重复定义。这样,物化视图在后台静默地提高了查询效率。

此外,StarRocks 通过 Colocation Join 功能进一步加速表的连接操作。该功能将一组具有相同分布的表分片组织成一个集合,并确保这些 Table 的分桶副本位于同一组节点上。在执行分桶列上的 Join 操作时,可以在本地节点上直接完成,减少数据在节点间的传输耗时。

图片

5.1 案例背景

业务运营团队的组织架构调整导致行业类目不定期变更,多个数据产品如 OneDash(公司/业务经营看板)、鹰眼(电商运营平台)、交易核心看板以及核心宽表都需要进行数据回刷。传统的 Spark 任务回刷成本高昂,迫切需要优化。

5.2 链路改造

图片

以交易核心看板和 OneDash 为例,原先的数据处理完全依赖于 Spark 引擎。出于性能考虑,商品行业的 Cube 表细分为两个版本:一个包含行业新老客户信息,另一个则不包含。然而,从业务需求出发,这两个版本的 Cube 表实际上可以合并为一张。鉴于 Cube 表计算的执行时间占比最大,可以将这一计算过程迁移至 StarRocks 平台,提升效率。

图片

如上图所示,改造后的新链路经过优化,最终对外只开放两个 Cube 表:商品行业新老客 Cube 表、商家行业 Cube 表。

  • 商品行业新老客 Cube 表整合了老链路中的两个独立表——商品行业新老客 Cube 和商品行业 Cube。新表直接依赖于一张综合的商品行业用户渠道宽表,该宽表包含了商品行业和新老客户维度的关键信息以及多种指标。这一合并减少了维护的复杂性。

  • 商家行业 Cube 表的链路也类似,它依赖于商家行业用户渠道宽表,而这个宽表本身依赖于商品行业用户渠道宽表产出。

这样设计的原因:1)保证商品行业 Cube 指标和商家行业 Cube 指标的一致性;2)StarRocks 中的关联操作可以使用 Colocate Join,效率比 Spark 要高。

分不同维度计算用户数、商品数和商家数时,我们会先对 user_id、spu_id 和 seller_id 进行编码,然后在中间表中构建对应的 BitMap。

5.3 回刷链路

图片

面对行业变更,我们采取主备链路的策略来应对涉及多个数据产品的复杂回刷任务。主链路负责持续为线上产品提供实时服务,而备链路则专门用于执行数据的回刷操作。

  • 在行业发生变更时,业务数据仓库会根据最新的行业映射信息,重新构建备链路上的商品行业和商家行业维表。与此同时,主链路上的维表保持原行业映射不变,确保业务连续性。回刷过去两年的数据,包括商家行业维表、行业新老客维表,以及最新一天的商品行业维表。

  • 历史数据的回刷通过将商家行业和行业新老客维表的数据导入到 StarRocks 中来完成,而对于商品行业维表,只需回刷最新一天的数据。

  • 接着我们更新商品行业维表下游的维表依赖关系,使其指向最新日期的数据,并调度起各业务的 Cube 回刷链路,对近 2 年的数据进行全面更新。这一整个过程都是通过 StarRocks SQL 任务来实现的。数据调度平台则负责执行回刷计划,关键表会部署数据质量检测任务(DQC),保证回刷过程中的数据符合预期。

  • 一旦所有的 Cube 回刷任务完成,我们便可以调度同步任务,利用 StarRocks 的外表导入功能,将备集群的更新结果同步到主集群中。这样的同步操作确保了主链路数据的及时更新,同时也保障了数据的完整性和业务的连续运行。

5.4 收益

通过将回刷链路部署到 StarRocks 集群中,我们实现了资源的高效利用,无需申请其他额外资源。同时,主链路的运行依托于现有的线上集群,没有额外消耗。这次链路改造带来的主要收益可以分为两大类:

  • 回刷收益:以最近一轮的回刷为例,回刷 2022 年和 2023 年共计两年的数据。我们对比了基于 Spark 和基于 StarRocks 的链路性能。结果显示,StarRocks 链路在资源消耗和成本上都有显著的减少,回刷时间节省 90%,回刷成本降低 99%。具体来说,资源消耗从上千万 GBHour 降低到 几十万 GBHour,成本从上百万元大幅下降到几千元,回刷时间从一个月缩短到几天。

  • 日常收益:在日常数据处理方面,StarRocks 链路同样展现出色。与 Spark 链路相比,StarRocks 没有额外资源消耗,每天的数据产出时间提前了 1.5 小时以上,数据处理时间缩短至几分钟,这样的改进不仅加快数据处理速度,还提高整体的工作效率。

图片

OLAP 引擎在实时数仓建设方面已经得到了广泛的应用。我们的实践证明,结合业务特点,在处理中小规模数据量时,使用 StarRocks 等分布式 OLAP 引擎替换 Spark ,承担更多的离线处理任务,可以显著提高数据仓库产出的速度和效率,达到降本增效的目的。

展望未来,我们计划进一步探索 StarRocks 在湖仓一体和存算分离的应用场景,以构建更加高效、灵活的数据生产链路和自助分析产品。我们期待通过这些创新实践,能够为公司带来更强大的数据处理能力,支持业务的持续增长和决策的精准性。

图片

  • 黄猿(吴筱琦)

小红书数据仓库工程师,现负责渠道归因和数据任务性能优化。

  • 马尔科(吴浩亮)

小红书数据解决方案专家,现负责小红书用户增长、搜推、基础流量、电商、直播等多个业务领域数仓建设。

  • 凌波(李娟)

小红书交易数据仓库开发,现负责小红书交易 C 端的数据建设

图片

数据仓库专家-基础方向

工作职责

  • 参与公司流量日志数据仓库设计、建设和治理工作

  • 对海量用户日志数据链路进行架构规划、建设管理,协同平台产品团队,迭代流量分析产品工具

  • 参与公司核心数据应用项目开发建设,推动数据驱动的业务决策。

相关要求

  • 拥有实时、离线数据链路开发经验,具有大厂流量域 PB 级日志流量数据处理经验

  • 熟悉数据仓库领域知识和技能,具备一定的代码开发能力 (如 Java、Scala 等)

  • 参与过流量域产品开发经验、有数据治理、数据质量体系建设、数据监控告警体系相关搭建经验加分

欢迎感兴趣的同学发送简历至 REDtech@xiaohongshu.com,并抄送至 huangyuan@xiaohongshu.com、marco@xiaohongshu.com。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/763838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(vue)el-card区分背景图片、点击进入对应页面

(vue)el-card区分背景图片、点击进入对应页面 项目背景&#xff1a;郑州院XX项目首页-工作台模块卡片点击可 快速进入对应页面 html <div class"board-card"><el-cardv-for"(item, index) of cardList":key"index"class"board-ca…

【二】【单片机】有关独立按键的实验

自定义延时函数Delay 分别用Delay.c文件存储Delay函数。用Delay.h声明Delay函数。每次将这两个文件复制到工程中&#xff0c;直接使用。 //Delay.c void Delay(unsigned int xms) //11.0592MHz {while(xms--){unsigned char i, j;i 2;j 199;do{while (--j);}…

[Linux]条件变量:实现线程同步(什么是条件变量、为什么需要条件变量,怎么使用条件变量(接口)、例子,代码演示(生产者消费者模式))

目录 一、条件变量 1.什么是条件变量 故事说明 2、为什么需要使用条件变量 竞态条件 3.什么是同步 饥饿问题 二、条件变量的接口 1.pthread_cond_t 2.初始化&#xff08;pthread_cond_init&#xff09; 3.销毁&#xff08;pthread_cond_destroy&#xff09; 4.等待&…

阿里云2核4G服务器租用价格和性能测评

阿里云2核4G服务器租用优惠价格&#xff0c;轻量2核4G服务器165元一年、u1服务器2核4G5M带宽199元一年、云服务器e实例30元3个月&#xff0c;活动链接 aliyunfuwuqi.com/go/aliyun 活动链接如下图&#xff1a; 阿里云2核4G服务器优惠价格 轻量应用服务器2核2G4M带宽、60GB高效…

Vue3 Vite3 状态管理 pinia 基本使用、持久化、在路由守卫中的使用

参考https://juejin.cn/post/7152774411571953677&#xff0c;自己简洁化了一部分 1.安装pinia依赖 yarn add pinia 创建pini实例 根目录创建store文件夹&#xff0c;然后创建index.js import { createPinia } from piniaconst pinia createPinia()export default pinia …

如何使用人工智能和ChatGPT来优化营销转化率

人工智能 &#xff08;AI&#xff09; 和营销的交集正在彻底改变企业与客户互动的方式&#xff0c;最终改变营销转化率。人工智能能够分析大量数据、理解模式和自动执行任务&#xff0c;它不仅是一项创新技术&#xff0c;而且是营销领域的根本性转变。这种转变允许更加个性化、…

【计算机毕业设计】ssm073基于Word自动出题系统

基于Word自动出题系统 操作系统: Windows XP或Windows 7 开发工具: myeclipse 数据库: MySQL 系统研究目的及意义&#xff1a; 本课题研究通过信息化的手段进行对试题的出题工作&#xff0c;实现更加有效便捷的试题的编写和试卷的生成。这样不仅可以最大程度上较少学校教研工作…

NacosException: http error, code=403、NacosimeException——报错解决方法【Nacos2.x】

1、NacosException报错内容为&#xff1a; NacosException: http error, code403,msguser not found!,dataIdapplication-dev.yml,groupDEFAULT_GROUP,tenant连不上是因为成功开启鉴权后&#xff0c;所使用的Spring Cloud服务被拦截&#xff0c;需要在配置中添加Nacos用户名和…

Harbor高可用(nginx和keepalived)

Harbor高可用&#xff08;nginx和keepalived&#xff09; 文章目录 Harbor高可用&#xff08;nginx和keepalived&#xff09;1.Harbor高可用集群部署架构1.1 主机初始化1.1.1 设置网卡名和ip地址1.1.2 设置主机名1.1.3 配置镜像源1.1.4 关闭防火墙1.1.5 禁用SELinux1.1.6 设置时…

基于OpenCV的图像处理案例之图像矫正(Python)

Index 目录索引 写在前面解决思路参考 写在前面 本文通过一个案例介绍如何使用OpenCV将倾斜的扫描文档图像进行水平矫正。 解决思路 因为扫描图像中的大部分文字倾斜后&#xff0c;同一行文字也在同一条直线&#xff0c;所以可以通过拟合直线来计算文本倾斜角度&#xff0c;…

C++初阶:2_类与对象(中)

类与对象(中) 一.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&am…

C语言自定义类型结构体

variable adj.易变的&#xff0c;多变的&#xff1b;时好时坏的&#xff1b;可变的&#xff0c;可调节的&#xff1b; &#xff08;数&#xff09;&#xff08;数字&#xff09;变量的&#xff1b;&#xff08;植&#xff0c;动&#xff09;变异的&#xff0c;变型的&#xff1…

【保姆级教程】YOLOv8_Track多目标跟踪,快速运行

一、YOLOV8环境准备 1.1 下载安装最新的YOLOv8代码 仓库地址&#xff1a; https://github.com/ultralytics/ultralytics1.2 配置环境 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple二、下载测试视频&#xff0c;预训练权重 测试视频 链接&am…

腾讯云COS - 前端上传文件到 COS 跨域问题

问题描述 原因分析 因为我本地的地址是&#xff1a;http://localhost:9528 而发送请求时的地址是&#xff1a;http://132-1307119153.cos.ap-beijing.myqcloud.com/tu.jpg 域名不同&#xff0c;自然而然就出现了跨域的问题&#xff01; 解决方案 先点击对象存储 - 安全设置…

mysql 事务基本介绍

目录 命令小结 一 MySQL事务的概念 &#xff08;一&#xff09;事务介绍 &#xff08;二&#xff09;事务特点 &#xff08;三&#xff09;事务的ACID特点 1&#xff0c;原子性 1.1 原子性具体形容 1.2 原子性案例 2 &#xff0c;一致性 2.1一致性具体介绍 2.2…

《数字集成电路物理设计》学习笔记(持续更新中)

参考书籍&#xff1a; 《数字集成电路物理设计》pdf下载百度云链接&#xff1a; 链接: https://pan.baidu.com/s/1jOD54q_f9KLhfX6InabTRA?pwd8888 提取码: 8888 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 --来自百度网盘超级会员v8的分享 目录 第1章 集…

索尼下一代游戏主机PS5将于11月20日发售

索尼下一代游戏机PS5将于2020年11月20日发布。据悉&#xff0c;这款游戏机的售价可能会达到499美元&#xff08;约合人民币3500元&#xff09;。 我们知道游戏主机的价格低于游戏PC的价格。 既然PS5的主要硬件配置已经公开&#xff0c;那么现在配置一台同样配置的游戏PC需要多少…

WSL2的安装步骤

WSL2&#xff08;Windows Subsystem for Linux 2&#xff09;是微软公司开发的一项创新性技术&#xff0c;它在Windows操作系统上提供了一个完整的Linux内核&#xff0c;并允许用户在Windows环境中运行Linux发行版。之前想在Windows上使用Linux系统必须先安装VirtualBox或VMWar…

实战whisper语音识别第一天,部署服务器,可远程访问,实时语音转文字(全部代码和详细部署步骤)

Whisper是OpenAI于2022年发布的一个开源深度学习模型&#xff0c;专门用于语音识别任务。它能够将音频转换成文字&#xff0c;支持多种语言的识别&#xff0c;包括但不限于英语、中文、西班牙语等。Whisper模型的特点是它在多种不同的音频条件下&#xff08;如不同的背景噪声水…

多线程基础 -概念、创建、等待、分离、终止

文章目录 一、 线程概念1. 什么是线程2. 线程的优点3.线程的缺点4. 线程异常5. 线程用途 二、 Linux进程VS线程1. 进程和线程2. 进程和线程的地址空间3. 进程和线程的关系 三、Linux线程控制1. POSIX线程库2. 线程创建3. 线程ID及进程地址空间布局4. 线程终止5. 线程等待6. 线程…