大数据数据工程中的存储格式选择:Parquet vs ORC

大数据存储格式深度对比:Parquet与ORC的技术选型指南

元数据框架

  • 标题:大数据存储格式深度对比:Parquet与ORC的技术选型指南
  • 关键词:大数据存储、列存格式、Parquet、ORC、性能优化、Schema演化、数据工程
  • 摘要:本文从第一性原理出发,系统对比Parquet与ORC两种主流大数据存储格式的设计逻辑、架构差异、性能表现及适用场景。通过理论推导+实践验证的方式,解析两者在压缩率、查询速度、Schema灵活性等核心维度的trade-off,并结合Netflix、Facebook等真实案例,为数据工程师提供可落地的选型策略。无论是冷数据存储还是热数据查询,无论是Hive生态还是Spark场景,本文都能给出清晰的决策依据。

1. 概念基础:大数据存储的底层逻辑

1.1 领域背景化:为什么需要列存格式?

大数据时代,数据量呈指数级增长(如Facebook日均产生500TB日志数据),传统行存格式(如CSV、JSON)的弊端愈发明显:

  • IO效率低:查询时需扫描整行数据,即使只需要少数列(如分析用户行为时仅需user_idaction),也会读取大量无关数据。
  • 压缩率低:行存中数据类型混杂(如整型、字符串、浮点型),无法高效利用压缩算法(如字典编码仅适用于重复值多的列)。
  • 查询性能差:缺乏索引支持,无法快速过滤数据(如查找age>30的用户需扫描全表)。

列存格式(Columnar Storage)应运而生,其核心思想是将同一列的数据连续存储,彻底解决了行存的痛点:

  • 减少IO:查询时仅读取所需列,IO量降至行存的1/10(假设查询10列中的1列)。
  • 提高压缩率:同一列数据类型一致,可采用更高效的压缩算法(如整型用RLE编码,字符串用字典编码),压缩率较行存高2-5倍。
  • 支持谓词下推:通过列级索引(如最小值/最大值统计、Bloom Filter),提前过滤不需要的数据,查询速度提升10-100倍。

1.2 历史轨迹:Parquet与ORC的起源

格式诞生时间开发团队设计目标现状
Parquet2013年Twitter + Cloudera解决Hadoop生态中的通用列存问题Apache顶级项目,支持Spark、Presto等
ORC2013年Facebook优化Hive的查询性能Apache顶级项目,Hive默认存储格式

1.3 问题空间定义:存储格式的核心需求

大数据工程中,存储格式的选择需平衡以下4个核心需求:

  1. 存储成本:压缩率越高,存储成本越低(如1TB数据压缩至100GB,成本降低90%)。
  2. 查询速度:索引越高效,查询延迟越低(如热数据查询需秒级响应)。
  3. Schema灵活性:支持Schema演化(如新增列、修改列类型),避免数据重写。
  4. 生态兼容性:支持Hive、Spark、Presto等主流计算引擎,避免 vendor lock-in。

1.4 术语精确性:关键概念辨析

  • 行存(Row Storage):按行存储数据,适合事务处理(如OLTP),代表格式:CSV、JSON、Avro。
  • 列存(Columnar Storage):按列存储数据,适合分析处理(如OLAP),代表格式:Parquet、ORC。
  • Schema-on-Write:写入时定义Schema,数据结构固定(如ORC),优点是查询速度快,缺点是Schema演化麻烦。
  • Schema-on-Read:读取时解析Schema,数据结构灵活(如Parquet),优点是Schema演化容易,缺点是查询时需额外解析成本。
  • 谓词下推(Predicate Pushdown):将查询条件(如age>30)下推至存储层,仅扫描符合条件的数据,减少计算层压力。

2. 理论框架:列存格式的第一性原理

2.1 第一性原理推导:列存的核心逻辑

列存的本质是**“数据访问模式决定存储方式”。大数据分析的典型访问模式是“读少数字段,读大量行”**(如统计用户平均年龄),列存通过以下方式优化该模式:

  • 空间局部性:同一列数据连续存储,磁盘IO时可批量读取(如128MB的行组),提高IO效率。
  • 数据相似性:同一列数据类型一致,压缩算法(如ZSTD、Snappy)可发挥最大效果(如整型列的压缩率可达80%以上)。
  • 索引有效性:列级索引(如最小值/最大值、Bloom Filter)可快速过滤数据,避免全表扫描。

2.2 数学形式化:性能与成本的量化模型

2.2.1 存储成本模型

存储成本 ( C = D \times (1 - \eta) \times P ),其中:

  • ( D ):原始数据量(GB);
  • ( \eta ):压缩率(如Parquet的( \eta=0.8 ),表示压缩后数据量为原始的20%);
  • ( P ):单位存储成本(元/GB/月)。

结论:压缩率越高,存储成本越低。Parquet的压缩率通常比ORC高5%-10%(如1TB数据,Parquet压缩至100GB,ORC压缩至110GB),因此存储成本更低。

2.2.2 查询时间模型

查询时间 ( T = T_{IO} + T_{Compute} ),其中:

  • ( T_{IO} = \frac{K}{C_{total}} \times \frac{D \times (1 - \eta)}{B} ):IO时间,( K )为查询列数,( C_{total} )为总列数,( B )为磁盘IO带宽(GB/s);
  • ( T_{Compute} ):计算时间(如解压、过滤、聚合),与数据量和计算引擎性能相关。

结论:查询列数越少,IO时间越短。ORC的索引更细粒度(如stripe级、row group级),可过滤更多无关数据,因此( T_{IO} )比Parquet短10%-20%,查询速度更快。

2.3 理论局限性:列存的边界

列存并非万能,其局限性包括:

  • 随机写性能差:列存需将新数据插入对应列块,导致大量IO(如实时数据写入时,行存的写入速度是列存的5-10倍)。
  • 全列查询性能差:若查询需访问所有列(如导出全表数据),列存的性能不如行存(需合并所有列数据)。
  • 元数据开销大:列存的元数据(如行组信息、列块索引)比行存多,若小文件过多(如1GB数据分成1000个文件),元数据会成为性能瓶颈。

2.4 竞争范式分析:列存 vs 行存 vs 半结构化

格式存储方式压缩率查询速度(分析场景)Schema灵活性适用场景
CSV行存低(~10%)慢(全表扫描)低(无Schema)数据导出、临时存储
JSON行存低(~15%)慢(解析成本高)高(半结构化)日志存储、API数据
Avro行存中(~30%)中(二进制格式)中(Schema-on-Write)实时数据管道、消息队列
Parquet列存高(~80%)快(列级索引)高(Schema-on-Read)冷数据存储、数据湖
ORC列存高(~75%)更快(细粒度索引)中(Schema-on-Write)热数据查询、数据仓库

3. 架构设计:Parquet与ORC的底层差异

3.1 系统分解:核心组件对比

3.1.1 Parquet的架构

Parquet文件的核心组件是行组(Row Group)列块(Column Chunk)页(Page)

  • 行组(Row Group):Parquet中最大的存储单元,默认大小128MB,包含多列数据(如128MB的行组可能包含100万行数据)。
  • 列块(Column Chunk):同一列在一个行组中的存储单元,包含该列的所有数据(如user_id列在某个行组中的数据)。
  • 页(Page):列块的最小存储单元,默认大小1MB,分为数据页(Data Page)字典页(Dictionary Page)索引页(Index Page)
    • 数据页:存储实际数据(如user_id的具体值),用压缩算法(如ZSTD)压缩。
    • 字典页:存储该列的字典编码(如将user_id的字符串值映射为整数,减少存储量)。
    • 索引页:存储该列的统计信息(如最小值、最大值、空值数量),用于谓词下推。

Parquet架构图(Mermaid):

渲染错误:Mermaid 渲染失败: Parse error on line 4: ... --> D[Column Chunk (user_id)] B --> E -----------------------^ Expecting 'SQE', 'DOUBLECIRCLEEND', 'PE', '-)', 'STADIUMEND', 'SUBROUTINEEND', 'PIPE', 'CYLINDEREND', 'DIAMOND_STOP', 'TAGEND', 'TRAPEND', 'INVTRAPEND', 'UNICODE_TEXT', 'TEXT', 'TAGSTART', got 'PS'
3.1.2 ORC的架构

ORC文件的核心组件是StripeRow GroupColumn Vector

  • Stripe:ORC中最大的存储单元,默认大小64MB,包含多组Row Group(如64MB的Stripe可能包含6个Row Group,每个Row Group 10000行)。
  • Row Group:Stripe中的子单元,默认10000行,包含多列的Column Vector(如某个Row Group中的user_idaction列)。
  • Column Vector:Row Group中的最小存储单元,存储同一列的多个行数据(如user_id列的10000个值),用数组形式存储(如int[]、byte[]),支持RLE编码和字典编码。

ORC的Stripe还包含Index Footer(索引脚注)和Data Footer(数据脚注):

  • 索引脚注:存储每个Row Group的统计信息(如最小值、最大值、Bloom Filter),用于谓词下推。
  • 数据脚注:存储Stripe的元数据(如Stripe大小、Row Group数量、列信息)。

ORC架构图(Mermaid):

渲染错误:Mermaid 渲染失败: Parse error on line 4: ...B --> D[Row Group 1 (10000行)] B --> E[ -----------------------^ Expecting 'SQE', 'DOUBLECIRCLEEND', 'PE', '-)', 'STADIUMEND', 'SUBROUTINEEND', 'PIPE', 'CYLINDEREND', 'DIAMOND_STOP', 'TAGEND', 'TRAPEND', 'INVTRAPEND', 'UNICODE_TEXT', 'TEXT', 'TAGSTART', got 'PS'

3.2 组件交互模型:写入与读取流程

3.2.1 Parquet的写入流程
  1. 数据划分:Spark/Hive将数据按行组大小(如128MB)划分成多个行组。
  2. 列数据收集:每个行组内的列数据被收集到对应的列块(如user_id列的所有数据被收集到一个列块)。
  3. 压缩与编码:列块中的数据页用压缩算法(如ZSTD)压缩,字典页存储该列的字典编码,索引页存储统计信息。
  4. 写入文件:将行组、列块、页的元数据写入Parquet文件。
3.2.2 ORC的写入流程
  1. 数据划分:Hive/Spark将数据按Stripe大小(如64MB)划分成多个Stripe。
  2. Row Group生成:每个Stripe内的数据被分成多个Row Group(如10000行/Row Group)。
  3. Column Vector编码:每个Row Group内的列数据用Column Vector存储,并用RLE编码或字典编码压缩。
  4. 索引与元数据写入:将Index Footer(统计信息)和Data Footer(元数据)写入Stripe。

3.3 设计模式应用:优化策略对比

设计模式Parquet的应用ORC的应用
分而治之行组划分,并行处理Stripe+Row Group划分,更细粒度
字典编码用于字符串列,减少重复值存储用于字符串列,结合RLE编码
索引优化行组级统计信息(最小值/最大值)Stripe+Row Group级统计信息+ Bloom Filter
压缩策略优先高压缩率(如ZSTD)优先快解压速度(如Snappy)

4. 实现机制:性能与灵活性的底层支撑

4.1 算法复杂度分析

4.1.1 Parquet的查询复杂度

假设Parquet文件有( R )个行组,每个行组有( C )个列块,每个列块有( P )个数据页,查询需访问( K )个列,则查询时间复杂度为:
[ T_{Parquet} = O(K \times R \times P) ]
说明:Parquet的索引是行组级,需扫描所有行组中的目标列块,因此复杂度与行组数量成正比。

4.1.2 ORC的查询复杂度

假设ORC文件有( S )个Stripe,每个Stripe有( G )个Row Group,每个Row Group有( C )个Column Vector,查询需访问( K )个列,则查询时间复杂度为:
[ T_{ORC} = O(K \times S’ \times G’) ]
其中( S’ \leq S )(通过Index Footer过滤不需要的Stripe),( G’ \leq G )(通过Row Group统计信息过滤不需要的Row Group)。
说明:ORC的索引更细粒度,可过滤更多无关数据,因此复杂度比Parquet低。

4.2 优化代码实现:Spark示例

4.2.1 Parquet的优化写入
// 读取JSON数据(假设数据包含user_id、action、timestamp、product_id、amount列)valdf=spark.read.json("s3://my-bucket/user-behavior.json")// 写入Parquet文件,优化配置:// 1. 行组大小设为128MB(提高压缩率)// 2. 压缩算法设为ZSTD(高压缩率+较快解压速度)// 3. 开启Schema合并(支持Schema演化)df.write.format("parquet").option("rowGroupSize","134217728")// 128MB(字节).option("compression","zstd").option("mergeSchema","true").mode("overwrite").save("s3://my-bucket/user-behavior.parquet")
4.2.2 ORC的优化写入
// 读取JSON数据valdf=spark.read.json("s3://my-bucket/advertising-data.json")// 写入ORC文件,优化配置:// 1. Stripe大小设为64MB(细粒度索引,提高查询速度)// 2. 压缩算法设为Snappy(快压缩+快解压,适合热数据)// 3. 为user_id列添加Bloom Filter(加速user_id查询)df.write.format("orc").option("stripeSize","67108864")// 64MB(字节).option("compression","snappy").option("orc.bloom.filter.columns","user_id").mode("overwrite").save("s3://my-bucket/advertising-data.orc")

4.3 边缘情况处理:Schema演化与null值

4.3.1 Schema演化
  • Parquet:支持Schema合并mergeSchema=true),当新增列时,旧数据的Schema会与新数据合并(旧数据的新增列值为null)。
  • ORC:支持Schema追加(新增列不会影响旧数据读取),但不支持Schema合并(需手动修改Schema)。

示例:假设旧Parquet文件有user_idaction列,新数据新增age列,读取时:

valdf=spark.read.option("mergeSchema","true").parquet("s3://my-bucket/user-behavior.parquet")df.printSchema()// 输出:user_id, action, age(age为null)
4.3.2 null值处理
  • Parquet:用bitmask存储null值(每个null值占1位),开销极小(如100万行数据的null值仅占125KB)。
  • ORC:同样用bitmask存储null值,且支持稀疏存储(仅存储非null值),进一步减少开销。

4.4 性能考量:压缩率与查询速度对比

维度ParquetORC
压缩率高(~80%)较高(~75%)
查询速度快(10GB数据查询约10秒)更快(10GB数据查询约8秒)
写入速度快(10GB数据写入约5分钟)较慢(10GB数据写入约6分钟)
内存占用较高(行组大,需更多内存)较低(Stripe小,内存占用少)

5. 实际应用:选型策略与最佳实践

5.1 实施策略:根据数据冷热程度选择

数据类型特点推荐格式原因
冷数据很少查询,长期存储Parquet高压缩率,减少存储成本
热数据频繁查询,需秒级响应ORC快查询速度,支持细粒度索引
温数据偶尔查询两者均可根据生态选择(如Hive选ORC,Spark选Parquet)

5.2 集成方法论:与计算引擎的兼容

5.2.1 Hive生态

ORC是Hive的默认存储格式,支持ACID事务(如INSERTUPDATEDELETE),适合作为数据仓库的存储格式。
示例:用Hive创建ORC表:

CREATETABLEadvertising_data(user_id STRING,actionSTRING,timestampTIMESTAMP,product_id STRING,amountDOUBLE)STOREDASORC TBLPROPERTIES("orc.stripe.size"="67108864",-- 64MB"orc.compression"="snappy","orc.bloom.filter.columns"="user_id");
5.2.2 Spark生态

Parquet是Spark的推荐存储格式,Spark的DataFrame API对Parquet的支持更成熟(如mergeSchema功能),适合作为数据湖的存储格式。
示例:用Spark读取Parquet文件并分析:

valdf=spark.read.parquet("s3://my-bucket/user-behavior.parquet")// 统计每个用户的行为次数valuserActionCount=df.groupBy("user_id").count()userActionCount.show()
5.2.3 Presto生态

Presto对ORC的查询性能更优(可利用ORC的细粒度索引),适合作为交互式查询引擎的存储格式。
示例:用Presto查询ORC表:

SELECTuser_id,COUNT(*)ASaction_countFROMadvertising_dataWHEREtimestamp>='2023-10-01'GROUPBYuser_idLIMIT10;

5.3 部署考虑因素:存储与分区

5.3.1 存储系统选择
  • HDFS:适合热数据存储(ORC),IO速度快,但存储成本高。
  • S3/ADLS:适合冷数据存储(Parquet),存储成本低,但IO速度慢。

最佳实践:将热数据存在HDFS(ORC格式),冷数据存在S3(Parquet格式),通过数据湖工具(如AWS Glue、Azure Data Factory)实现数据迁移。

5.3.2 数据分区与分桶
  • 分区:按时间(如date=2023-10-01)或业务维度(如region=china)分区,减少查询时的扫描数据量。
  • 分桶:按高频查询列(如user_id)分桶(如bucket by user_id into 100 buckets),提高查询时的并行处理能力。

示例:用Spark创建分区+分桶的Parquet表:

df.write.format("parquet").partitionBy("date")// 按日期分区.bucketBy(100,"user_id")// 按user_id分桶(100个桶).mode("overwrite").saveAsTable("user_behavior_partitioned_bucketed")

5.4 运营管理:优化与监控

5.4.1 小文件合并

小文件(如<128MB的Parquet文件)会增加元数据开销,影响查询性能。可通过Spark的repartitioncoalesce方法合并小文件:

valdf=spark.read.parquet("s3://my-bucket/small-files.parquet")df.repartition(100)// 合并成100个文件(每个约1GB).write.format("parquet").mode("overwrite").save("s3://my-bucket/large-files.parquet")
5.4.2 数据监控
  • 存储监控:用Prometheus监控HDFS/S3的存储量(如Parquet文件的总大小、ORC文件的总大小)。
  • 查询监控:用Spark UI或Presto UI监控查询时间(如Parquet查询的IO时间、ORC查询的索引过滤效率)。

6. 高级考量:未来趋势与伦理问题

6.1 扩展动态:格式的演化方向

  • Parquet的扩展:支持更多压缩算法(如LZO)、优化Schema演化性能(如增量合并)、支持实时数据写入(如Append模式)。
  • ORC的扩展:支持全文索引(如Lucene索引)、优化ACID事务性能(如批量更新)、支持更多云存储系统(如Google Cloud Storage)。

6.2 安全影响:数据加密与访问控制

  • 透明数据加密(TDE):Parquet和ORC都支持HDFS加密区(Encryption Zones),通过KMS管理密钥,确保数据在存储时加密。
  • 访问控制:通过HDFS的ACL或S3的IAM,限制用户对Parquet/ORC文件的访问(如仅数据分析师能访问广告数据)。

6.3 伦理维度:隐私与公平性

  • 数据隐私:列存格式可隐藏敏感列(如查询时仅访问user_idaction,不访问age),减少敏感数据暴露风险。但需结合匿名化处理(如将user_id替换为哈希值),才能彻底保护隐私。
  • 数据公平性:热数据(如近期的用户行为)的查询速度快,可能导致分析结果偏向热数据,忽略冷数据(如早期的用户行为)。需定期平衡热数据与冷数据的查询频率,确保分析结果公平。

6.4 未来演化向量:智能与兼容

  • 智能索引:利用机器学习模型预测用户查询模式(如用户经常查询user_id=123),生成针对性的索引(如Bloom Filter),提高查询效率。
  • Hybrid存储:结合行存(如Avro)和列存(如ORC),行存用于实时数据写入(随机写快),列存用于历史数据存储(压缩率高、查询快),定期将行存数据合并到列存。
  • 跨云兼容:支持更多云存储系统的API(如Google Cloud Storage的gs://协议),提高数据的可移植性(如从AWS S3迁移到Azure ADLS)。

7. 综合与拓展:选型总结与研究前沿

7.1 选型总结:核心决策树

冷数据(很少查询)

热数据(频繁查询)

温数据(偶尔查询)

Hive

Spark

Presto

开始

数据类型?

选Parquet(高压缩率)

选ORC(快查询速度)

生态?

选ORC(默认格式)

选Parquet(生态成熟)

选ORC(查询性能优)

7.2 跨领域应用:机器学习与实时分析

  • 机器学习:Parquet适合存储训练数据(高压缩率、读取部分列快),ORC适合存储验证数据(快查询速度、支持实时验证)。
  • 实时分析:ORC适合存储实时数据(如Kafka流数据),通过Spark Streaming写入ORC文件,支持秒级查询(如实时统计广告点击量)。

7.3 研究前沿:智能列存与随机写优化

  • 智能列存:用深度学习模型生成更高效的压缩编码(如对于文本列,用BERT生成的嵌入向量进行压缩),提高压缩率和解压速度。
  • 随机写优化:将列存与日志结构合并树(LSM Tree)结合,用LSM Tree存储实时数据(随机写快),定期将LSM Tree中的数据合并到列存(压缩率高、查询快)。

7.4 开放问题:待解决的挑战

  1. 如何平衡压缩率与查询速度?:更高的压缩率意味着更慢的解压速度,需找到两者的平衡点(如根据数据的冷热程度动态调整压缩算法)。
  2. 如何提高列存的随机写性能?:列存的随机写性能差,需优化存储结构(如Hybrid存储)或写入算法(如批量写入)。
  3. 如何支持更灵活的Schema?:嵌套Schema(如JSON中的嵌套对象)和动态Schema(如Schema随时间变化)的支持,需在不影响性能的情况下实现。

8. 战略建议:写给数据工程师的话

  1. 优先考虑数据的访问模式:如果查询以分析为主(读少数字段),选列存(Parquet/ORC);如果查询以事务为主(读整行),选行存(Avro)。
  2. 根据生态选择格式:如果用Hive,选ORC;如果用Spark,选Parquet;如果用Presto,选ORC。
  3. 优化存储配置:根据数据量调整行组/Stripe大小(如128MB的行组适合大文件,64MB的Stripe适合小文件),选择合适的压缩算法(如ZSTD适合冷数据,Snappy适合热数据)。
  4. 定期优化数据:合并小文件、清理过期数据、更新索引,保持数据的查询性能。

参考资料

  1. Apache Parquet官方文档:https://parquet.apache.org/
  2. Apache ORC官方文档:https://orc.apache.org/
  3. 《Column-Oriented Database Systems》论文:https://db.cs.cmu.edu/papers/2005/column-oriented-db.pdf
  4. Netflix技术博客:《Using Parquet for Efficient Data Storage》
  5. Facebook技术博客:《ORC: Optimized Row Columnar Storage for Hive》

结语:Parquet与ORC并非竞争关系,而是互补关系。数据工程师需根据数据类型、访问模式、生态需求选择合适的格式,才能在存储成本与查询性能之间找到最佳平衡点。随着大数据技术的发展,列存格式将继续演化,智能索引、Hybrid存储等新技术将进一步提升列存的性能与灵活性。

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

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

相关文章

2025年12月 GESP CCF编程能力等级认证Python二级真题

答案和更多内容请查看网站&#xff1a;【试卷中心 -----> CCF GESP ----> Python ----> 二级】 网站链接 青少年软件编程历年真题模拟题实时更新 2025年12月 GESP CCF编程能力等级认证Python2级真题 一、 单选题&#xff08;每题 2 分&#xff0c;共 30 分&…

conda虚拟环境备份与安装

1、备旧环境配置到新环境 # 激活进入环境 conda activate my_env # 导出当前环境配置信息 conda env export > my_env_environment.yml # 导出依赖包 conda list --explicit > my_env_packages.txt # 创建新的虚拟环境 conda create --name my_new_env # 激活进入 conda …

全网最全9个一键生成论文工具,专科生毕业论文轻松搞定!

全网最全9个一键生成论文工具&#xff0c;专科生毕业论文轻松搞定&#xff01; 论文写作的救星&#xff1a;AI 工具如何改变专科生的学术之路 在当今这个信息爆炸的时代&#xff0c;论文写作已成为专科生毕业过程中不可回避的一环。面对繁重的写作任务、复杂的格式要求以及严格…

Qt学习记录

1.打印2.LABEL3信号槽&#xff08;Signal & Slot&#xff09;&#xff08;信号回调函数&#xff09;4.自定义信号槽&#xff1a;5.不用UI6.对象树7.添加资源&#xff1a;8.样式表QSS

java: 找不到符号,零基础入门到精通,收藏这篇就够了

文章目录 一、报错如图二、自己当前项目背景描述&#xff1a;三、排错方案举例 方案1&#xff1a;考虑Project Structure设置中Project中jdk版本是否对&#xff0c;确保所有子模块改为jdk1.8就好了方案2&#xff1a;考虑设置中java编码方式中各个子模块版本是否为1.8&#xff…

一文看懂Java内存模型(JMM)收藏这篇就够了

文章目录 Java内存模型介绍 总览图 Java内存模型图线程、主内存、工作内存关系图CPU缓存架构图Java内存模型与硬件内存架构的关系 什么是Java内存模型Java内存模型的意义Java内存模型规范 Java内存模型的主要结构 1、程序计数器&#xff08;Program Counter Register&#xff0…

【免费开源文本编辑器】轻量级文本编辑器——Notepad++ 下载安装教程

需求背景&#xff1a; 在数字时代的编程开发和文本处理工作中&#xff0c;一款功能强大且高效的文本编辑器至关重要。虽然Windows系统自带的记事本能满足基本需求&#xff0c;但在专业场景下显得力不从心。今天为您推荐 Notepad —— Windows平台最受欢迎的免费开源文本编辑器…

LeetCode 468 验证 IP 地址

文章目录摘要描述IPv4 的规则可以总结成一句话IPv6 的规则则是题解答案题解代码分析IPv4 校验逻辑拆解IPv6 校验逻辑拆解示例测试及结果示例 1示例 2示例 3时间复杂度空间复杂度总结摘要 《验证 IP 地址》是一道非常工程化的题。 它不像很多算法题那样考复杂技巧&#xff0c;…

状态管理:Flutter 为什么走上了和前端一样的“百家争鸣”?

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

DeepSeek对于DuckDB on LoongArch一文的总结

原文地址 https://duckdb.org/2026/01/06/duckdb-on-loongarch-morefine用中文总结附件这是一篇由 Hannes Mhleisen 于2026年1月6日撰写的技术博客&#xff0c;主要内容为在基于龙芯架构&#xff08;LoongArch&#xff09;的龙芯CPU设备&#xff08;MOREFINE M700S&#xff09;…

学长亲荐2026自考AI论文工具TOP10:选对工具轻松过关

学长亲荐2026自考AI论文工具TOP10&#xff1a;选对工具轻松过关 2026年自考AI论文工具测评&#xff1a;选对工具&#xff0c;事半功倍 随着人工智能技术的不断进步&#xff0c;越来越多的自考生开始借助AI写作工具提升论文写作效率。然而&#xff0c;面对市场上琳琅满目的工具&…

Springboot品牌购物官网rmu1i本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表项目功能&#xff1a;开题报告内容进度安排&#xff1a;1、XXXX年X月X日-XXXX年X月XX日&#xff1a;完成前期资料的搜集与整理&#xff0c;撰写开题报告以及开题PPT。2、XXXX年X月X日-XXXX年X月XX日&#xff1a;设计完成系统的总体框架。3、XXXX年X月X日-XXXX年…

一文看懂 NVIDIA 平台全栈:从 CUDA 到 Jetson / DRIVE / Isaac 的当下走向

&#x1f4fa; B站视频讲解&#xff08;Bilibili&#xff09;&#xff1a;https://www.bilibili.com/video/BV1k1C9BYEAB/ &#x1f4d8; 《Yocto项目实战教程》京东购买链接&#xff1a;Yocto项目实战教程 一文看懂 NVIDIA 平台全栈&#xff1a;从 CUDA 到 Jetson / DRIVE / …

群体智能 AI Agent:多个 LLM 协作的分布式系统

群体智能 AI Agent:多个 LLM 协作的分布式系统 关键词:群体智能、AI Agent、大型语言模型(LLM)、分布式系统、多 LLM 协作 摘要:本文围绕群体智能 AI Agent 这一多个 LLM 协作的分布式系统展开深入探讨。首先介绍了该系统提出的背景、目的、适用读者及文档结构等信息。接着…

nums.sort()和nums.sort((a, b) => a - b)

这两者有重要区别&#xff1a; nums.sort() 默认按字符串排序&#xff08;字典序&#xff09;&#xff0c;即使数组里是数字也会被转换为字符串再比较&#xff1a; let nums [100, 4, 200, 1, 3, 2]; nums.sort(); // [1, 100, 2, 200, 3, 4] console.log(nums); // 错误的顺序…

吐血推荐10个AI论文网站,自考本科论文格式规范必备!

吐血推荐10个AI论文网站&#xff0c;自考本科论文格式规范必备&#xff01; 自考论文写作的“神器”正在改变你的学习方式 在自考本科论文写作过程中&#xff0c;许多学生都面临一个共同难题&#xff1a;如何高效完成一篇符合格式规范、内容严谨的论文。尤其是在当前AIGC技术广…

大数据领域数据安全防护的最佳实践分享

大数据安全不踩坑&#xff1a;10个实战派最佳实践帮你守住数据生命线 引言&#xff1a;大数据时代&#xff0c;你的数据安全防线牢吗&#xff1f; 当企业每天处理TB级甚至PB级数据时&#xff0c;一次数据泄漏可能引发连锁反应&#xff1a; 某电商平台因用户订单数据未加密&…

大数据领域数据安全防护的最佳实践分享

大数据安全不踩坑&#xff1a;10个实战派最佳实践帮你守住数据生命线 引言&#xff1a;大数据时代&#xff0c;你的数据安全防线牢吗&#xff1f; 当企业每天处理TB级甚至PB级数据时&#xff0c;一次数据泄漏可能引发连锁反应&#xff1a; 某电商平台因用户订单数据未加密&…

Springboot劳务派遣人事系统gjfr3(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表项目功能&#xff1a;用工单位,劳动者,岗位招聘,劳务派遣,工资账套开题报告内容一、选题背景与意义&#xff08;一&#xff09;选题背景随着劳务派遣市场的快速发展&#xff0c;其作为一种灵活高效的用工方式&#xff0c;被越来越多的企业所采用。据人社部统计…

分页(Paging)完全解析

分页&#xff08;Paging&#xff09;完全解析 &#x1f3af; 一句话概括 分页 把内存切成固定大小的页&#xff0c;通过页表实现虚拟地址到物理地址的映射&#xff0c;让程序以为自己拥有连续的大内存&#xff0c;实际物理内存可以是不连续的碎片。 &#x1f3d7;️ 核心概念&…