Apache Parquet 文件组织结构
简要概述
Apache Parquet 是一个开源、列式存储文件格式,最初由 Twitter 与 Cloudera 联合开发,旨在提供高效的压缩与编码方案以支持大规模复杂数据的快速分析与处理。Parquet 文件采用分离式元数据设计 —— 在数据写入完成后,再追加文件级元数据(包括 Schema、Row Group 与 Column Chunk 的偏移信息等),使得写入过程只需一次顺序扫描,同时读取端只需先解析元数据即可随机访问任意列或任意 Row Group。其核心结构包括:
- Header(魔数“PAR1”)
- 若干 Row Group(行组)
- Footer(文件级元数据 + 魔数“PAR1”)
文件格式总体布局
1. Header(文件头)
- 文件以4字节的魔数
PAR1
开始,标识这是一个 Parquet 文件格式。
2. Row Group(行组)
- Row Group 是水平切分的数据分片,每个 Row Group 包含表中若干行,通常大小在几十 MB 到几百 MB 之间,以兼顾并行处理与内存使用。
- 每个 Row Group 内部再按列拆分为若干 Column Chunk,支持对单个列或多个 Row Group 进行跳过式读取。
3. Column Chunk(列区块)
- Column Chunk 即某一列在某个 Row Group 中的数据块,它是 Parquet 最基本的物理存储单元之一。
- 每个 Column Chunk 中又分成多个Page,以便更细粒度地管理压缩与解压效率。
4. Page(页)
- Page 是 Column Chunk 中的最小读写单元,主要有三种类型:
- Dictionary Page:存放字典编码字典。
- Data Page:存放实际列数据(可进一步分为 Data Page V1/V2)。
- Index Page(可选):存放 Page-level 索引,加速定位。
- 通过 Page 级别的压缩与编码,Parquet 能够对不同类型的数据采用最优策略,极大提升 I/O 性能。
5. Footer(文件尾)
- 写入完全部 Row Group 后,接着写入File Metadata,其中包含:
- Schema 定义
- 每个 Row Group 的偏移及长度
- 每个 Column Chunk 的偏移、页信息、编码与压缩算法
- 最后再写入 4 字节魔数
PAR1
,完整标识文件结束。
元数据管理
- Thrift 定义:Parquet 使用 Apache Thrift 描述元数据结构(Schema、Row Group 元信息、Column Chunk 元信息、Page Header 等),以保证跨语言支持。
- 单次写入:由于元数据紧跟数据之后写入,写入端无需回写或多次扫描,保证单次顺序写入效率。
- 快速读取:读端先读取文件末尾的 Footer,加载所有元数据后即可随机、并行地读取任意列与任意 Row Group,极大减少磁盘 I/O 与网络传输开销。
编码与压缩技术
字典编码(Dictionary Encoding)
- 针对低基数(unique values 较少)的列,自动开启字典编码,将原值映射到字典索引,从而显著减少存储量。
混合 RLE + Bit-Packing
- Parquet 对整数类型实现了混合 RLE(Run-Length Encoding)与Bit-Packing,根据数据分布动态选择最佳方案,例如对于长串相同值使用 RLE,对于小整数值使用 Bit-Packing。
其它压缩算法
- 支持 Snappy、Gzip、LZO、Brotli、ZSTD、LZ4 等多种压缩格式,可按列灵活选择。
写入过程原理
- Schema 序列化:将 DataFrame/表结构映射为 Thrift Schema。
- Row Group 切分:按预设行数或大小切分成多个 Row Group。
- Column Chunk 生成:对每个列分别收集数据,分 Page 编码与压缩。
- 顺序写入:先写 Header → 各 Row Group 的 Column Chunk(含 Page)→ Footer(含全部元数据)→ 终止魔数。
读取过程原理
- 读取 Footer:读取文件末尾 8 字节(4 字节元数据长度 + 4 字节魔数),定位并加载全部元数据。
- 筛选元数据:根据查询列与过滤条件,决定需要加载的 Column Chunk 与 Page 位置。
- 随机/并行读取:直接跳转到各 Column Chunk 的偏移位置,按需加载并解压 Page。
- 重建记录:将各列 Page 解码后重组成行,供上层引擎消费。
实践示例:使用 Python 创建并写入 Parquet
下面示例演示如何用 pandas+pyarrow 将一个简单表格写入 Parquet,并简要注释写入过程:
import pandas as pd# 1. 创建 DataFrame
df = pd.DataFrame({"user_id": [1001, 1002, 1003],"event": ["login", "purchase", "logout"],"timestamp": pd.to_datetime(["2025-04-20 10:00:00","2025-04-20 10:05:00","2025-04-20 10:10:00"])
})# 2. 写入 Parquet(默认 row_group_size=64MB,可通过 partition_cols 分区)
df.to_parquet("events.parquet", engine="pyarrow", compression="snappy")
- pandas 在内部将 DataFrame Schema 转为 Thrift Schema;
- 按列生成 Column Chunk 并分 Page 编码;
- 最后输出 Header、Column Chunk、Footer 以及魔数字段。
1. Row Group 的概念与分割原则
- Row Group 是 Parquet 中最小的水平切分单元,表示若干行的完整切片。一个 Parquet 文件由一个或多个 Row Group 依次组成,每个 Row Group 内部再按列拆分为若干 Column Chunk,支持列式读写与跳过式扫描。
- 选择合适的 Row Group 大小,是在I/O 效率(大块顺序读更快)和并行度/内存占用(小块更易并行、占用更少)间的权衡。
2. Row Group 的“大小”度量方式
Parquet 对 Row Group 的大小有两种常见度量:
- 未压缩字节数(uncompressed bytes)
- 行数(number of rows)
- 在 Parquet-Java(Hadoop/Spark 常用)中,
ParquetProperties.DEFAULT_ROW_GROUP_SIZE
默认为 128 MiB(未压缩),并以字节为单位控制切分。 - 在 PyArrow(Python 生态)中,
row_group_size
参数实际上是以行数为单位;若不指定(None
),默认值已被调整为 1 Mi 行(绝对最大值仍为 64 Mi 行)。
3. 不同实现中的默认值与推荐配置
实现 / 场景 | 默认值 | 推荐范围 | 说明 |
---|---|---|---|
Parquet-Java | 128 MiB(未压缩) | 512 MiB – 1 GiB(未压缩) | 与 HDFS 块大小对齐,一般 HDFS 块也应设为 1 GiB,以便一组 Row Group 刚好填满一个块 |
Spark/HDFS | spark.sql.files.maxPartitionBytes 默认 128 MiB | 同上 | Spark 会将每个 Row Group 当作一个分区,读写时以此并行 |
PyArrow | 1 Mi 行 | 视数据表宽度换算成字节 | 若表宽为 10 列、每列单元假设 4 字节,1 Mi 行 ≈ 40 MiB(未压缩) |
其他工具(如 DuckDB/Polars) | 通常基于“每行最大允许字节数”来推算,默认约 1 Mi 行 | 需参考各自文档 | 如 Polars 中 row_group_size_bytes 默认 122 880 KiB(≈ 120 MiB) |
4. Row Group 在文件中的物理结构
一个 Row Group 在文件中的布局可以抽象为:
+--------------------------------------------+
| Row Group |
| ┌───────────────────────────────────────┐ |
| │ Column Chunk for Column 0 │ │
| │ ┌── Page 1 (Dictionary Page?) │ │
| │ │ - Page Header │ │
| │ │ - 字典或数据块 │ │
| │ └── Page 2 (Data Page v1/v2) │ │
| │ - Page Header │ │
| │ - 压缩/编码后的列数据 │ │
| │ … │ │
| └───────────────────────────────────────┘ │
| ┌───────────────────────────────────────┐ │
| │ Column Chunk for Column 1 │ │
| │ … │ │
| └───────────────────────────────────────┘ │
| ⋮ |
| ┌───────────────────────────────────────┐ │
| │ Column Chunk for Column N │ │
| │ … │ │
| └───────────────────────────────────────┘ │
+--------------------------------------------+
同时,文件末尾的 Footer 中包含了每个 Row Group 的元数据(Thrift 定义),主要字段有:
total_byte_size
:该 Row Group 内所有 Column Chunk 未压缩数据总字节数num_rows
:该 Row Group 包含的行数columns: list<ColumnChunk>
:每个 ColumnChunk 的偏移、长度、编码、压缩算法、Page 统计等
读写时,写端按序将上述 Row Group 数据写入磁盘,待所有 Row Group 完成后再写 Footer 与尾部魔数;读端则先读 Footer,加载元数据后即可随机定位到任意 Row Group 和任意字段的 Column Chunk 进行解压与解码。
5. 举例说明
假设有一个表 10 列,每列单元平均占用 4 字节,我们若以 1 Mi 行为 Row Group(PyArrow 默认值),则:
- 未压缩 Row Group 大小 ≈ 1 Mi × 10 列 × 4 B ≈ 40 MiB。
- 压缩后:若使用 Snappy,通常可压缩到 1/2 – 1/4,大约 10 MiB – 20 MiB。
- 如果改为 Parquet-Java 默认 128 MiB(未压缩),则 Row Group 行数可按上述公式反算:128 MiB ÷ (10 × 4 B) ≈ 3.3 Mi 行。
小结
- Row Group 大小既可以用字节也可以用行数度量,具体含义取决于所用写入器与参数;
- Parquet-Java 默认 128 MiB(未压缩),官方推荐 512 MiB – 1 GiB;
- PyArrow 默认 1 Mi 行,且新版已调整绝对最大 64 Mi 行;
- 结构上,Row Group 包含多列的 Column Chunk,每个 Column Chunk 又由若干 Page 组成;
- 选取合适的 Row Group 大小,可在 顺序 I/O 性能 与 并行度/内存占用 之间取得平衡。
import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq# 1. 创建示例 DataFrame
df = pd.DataFrame({"user_id": [1001, 1002, 1003, 1004],"event": ["login", "purchase", "logout", "login"],"timestamp": pd.to_datetime(["2025-04-20 10:00:00","2025-04-20 10:05:00","2025-04-20 10:10:00","2025-04-20 10:15:00"])
})# 2. 写入 Parquet(指定 row_group_size 为 2 行,以演示多个 Row Group)
pq.write_table(pa.Table.from_pandas(df), 'events.parquet', row_group_size=2)# 3. 读取 Parquet 元数据并提取 Row Group 信息
pq_file = pq.ParquetFile('events.parquet')
row_groups = []
for i in range(pq_file.num_row_groups):rg = pq_file.metadata.row_group(i)row_groups.append({"row_group_id": i,"num_rows": rg.num_rows,"total_byte_size": rg.total_byte_size})# 4. 展示 Row Group 元数据
rg_df = pd.DataFrame(row_groups)
import ace_tools as tools; tools.display_dataframe_to_user("Row Group Metadata", rg_df)
相关文章:
Apache Parquet 文件组织结构
简要概述 Apache Parquet 是一个开源、列式存储文件格式,最初由 Twitter 与 Cloudera 联合开发,旨在提供高效的压缩与编码方案以支持大规模复杂数据的快速分析与处理。Parquet 文件采用分离式元数据设计 —— 在数据写入完成后,再追加文件级…...
深度学习方向急出成果,是先广泛调研还是边做实验边优化?
目录 有限资源下本科生快速发表深度学习顶会论文的实战策略 1.短周期内可出成果的研究路径 2.论文阅读与复现的优先顺序 3.无一对一指导时的调研与实验组织 4.成功案例:本科生顶会论文经验 5.快速上手的研究子方向推荐 大家好这里是AIWritePaper官方账号&…...
Python 深度学习实战 第11章 自然语言处理(NLP)实例
Python 深度学习实战 第11章 自然语言处理(NLP)实例 内容概要 第11章深入探讨了自然语言处理(NLP)的深度学习应用,涵盖了从文本预处理到序列到序列学习的多种技术。本章通过IMDB电影评论情感分类和英西翻译任务,详细介绍了如何使…...
9、Hooks:现代魔法咒语集——React 19 核心Hooks
一、魔法咒语的本质革新 "类组件如同古老的魔杖挥舞仪式,而Hooks是新时代的无杖施法!"霍格沃茨魔法研究院的魔杖动力学教授惊叹道。React Hooks通过函数式能量场重构了魔法运作模式,让组件能量流转如尼可勒梅的炼金术。 ——以《国…...
FutureTask底层实现
一、FutureTask的基本使用 平时一些业务需要做并行处理,正常如果你没有返回结果的需求,直接上Runnable。 很多时候咱们是需要开启一个新的线程执行任务后,给我一个返回结果。此时咱们需要使用Callable。 在使用Callable的时候,…...
深入浅出:LDAP 协议全面解析
在网络安全和系统管理的世界中,LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)是一个不可忽视的核心技术。它广泛应用于身份管理、认证授权以及目录服务,尤其在企业级环境中占据重要地位。本文将从基…...
学习笔记—C++—string(练习题)
练习题 仅仅反转字母 917. 仅仅反转字母 - 力扣(LeetCode) 题目 给你一个字符串 s ,根据下述规则反转字符串: 所有非英文字母保留在原有位置。所有英文字母(小写或大写)位置反转。 返回反转后的 s 。…...
论文阅读:2024 arxiv DeepInception: Hypnotize Large Language Model to Be Jailbreaker
总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 DeepInception: Hypnotize Large Language Model to Be Jailbreaker DeepInception:催眠大型语言模型,助你成为越狱者 https://arxiv.org/pdf/2311.0…...
OC底层原理【一】 alloc init new
OC底层原理【一】 alloc init && new 文章目录 OC底层原理【一】 alloc init && new前言allocslowpath(checkNil && !cls)) 和 fastpath(!cls->ISA()->hasCustomAWZ())!cls->ISA()->hasCustomAWZ()) obj->initInstanceIsa();将类与isa关…...
集合框架拓展--stream流的使用
Stream(JDK8新特性) 什么是Stream? 也叫stream流,是JDK8开始新增的一套API(java.util.stream.*),可以用于操作集合或数组中的数据 优势:Stream流大量地结合了Lambda的语法风格来编程ÿ…...
Beszel 轻量级服务器监控平台的详细安装步骤
什么是 Beszel Beszel 是一个轻量级的服务器监控平台,包含 Docker 统计信息、历史数据和警报功能。 它拥有友好的 Web 界面、简单的配置,并且开箱即用。它支持自动备份、多用户、OAuth 身份验证和 API 访问 https://beszel.dev/zh/guide/what-is-besz…...
Spring 微服务解决了单体架构的哪些痛点?
1. 部署困难 (Deployment Difficulty & Risk) 单体痛点: 整体部署: 对单体应用的任何微小修改(哪怕只是一行代码),都需要重新构建、测试和部署整个庞大的应用程序。部署频率低: 由于部署过程复杂且风险高,发布周期通常很长&a…...
Kotlin delay方法解析
本文记录了kotlin协程(Android)中delay方法的字节码实现,并解析了delay方法如何实现挂起操作。 一、delay方法介绍 1.1、delay方法使用举例 class TestDelay {suspend fun testDelay() {Log.d("TestDelay", "before delay")delay(1000)Log.d…...
C# 类型、存储和变量(用户定义类型)
本章内容 C#程序是一组类型声明 类型是一种模板 实例化类型 数据成员和函数成员 预定义类型 用户定义类型 栈和堆 值类型和引用类型 变量 静态类型和dynamic关键字 可空类型 用户定义类型 除了C#提供的16种预定义类型,还可以创建自己的用户定义类型。有6种类型可以…...
C语言之高校学生信息快速查询系统的实现
🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 C语言之高校学生信息快速查询系统的实现 目录 任务陈述与分析 问题陈述问题分析 数据结构设…...
Windows串口通信
Windows串口通信相比较Android串口通信,在开发上面相对方便一些。原理都是一样,需要仔细阅读厂商设备的串口通信协议。结合串口调试助手进行测试,测试通过后,编写代码实现。 比如近期就接触到了一款天平,其最大测量值为100g,测量精度0.001g。 拿到手之后我就先阅读串口通…...
从零开始用Pytorch实现LLaMA 4的混合专家(MoE)模型
近期发布的LLaMA 4模型引入了混合专家(Mixture of Experts, MoE)架构,旨在提升模型效率和性能。尽管社区对LLaMA 4的实际表现存在一些讨论,但MoE作为一种重要的模型设计范式,继Mistral等模型之后再次受到关注。 所以我…...
python3GUI--仿网课答题播放器 By:PyQt5(分享)
文章目录 一.前言二.相关知识1.PyQt52.QMediaPlayer3.QThread4.Sqlite3 二.展示1.主界面2.课程播放&问答3.字幕调整4.播放列表折叠5.添加课程 三.心得与分享1.数据本地化2.自定义组件3.系统流程图与代码量4.免责声明 四&#…...
Python基础总结(八)之循环语句
文章目录 一、for循环1.1 for循环格式1.2 for ...else1.3 for...break1.4 for...continue 二、while循环2.1 while循环格式2.2 while...break2.3 while...continue2.4 while ...else 循环语句就如其名,就是重复的执行一段代码,直到满足退出条件时&#x…...
21. git apply
基本概述 git apply 的作用是:应用补丁文件 基本用法 1.命令格式 git apply [选项] <补丁文件>2.应用补丁 git apply patchfile.patch将补丁应用到工作目录,但不会自动添加到暂存区(需手动 git add) 常用选项 1.检查…...
第一章:MySQL视图基础
1. 视图是什么? 定义:视图(View)是一种虚拟表,其内容基于一个或多个真实表(基表)的查询结果。视图不实际存储数据,而是通过查询动态生成数据。核心特点:…...
深入理解基线检查:网络安全的基石
深入理解基线检查:网络安全的基石 一、引言 在信息技术飞速发展的今天,网络安全已成为企业和组织正常运营的关键保障。从日常办公系统到关键业务应用,任何环节的安全漏洞都可能导致严重的后果,如数据泄露、系统瘫痪等。基线检查作…...
33-公交车司机管理系统
技术: 基于 B/S 架构 SpringBootMySQLvueelementui 环境: Idea mysql maven jdk1.8 node 用户端功能 1.首页:展示车辆信息及车辆位置和线路信息 2.模块:车辆信息及车辆位置和线路信息 3.公告、论坛 4.在线留言 5.个人中心:修改个人信息 司机端功能…...
【AI实践】使用DeepSeek+CherryStudio绘制Mermaid格式图表
目录 工具准备创建DeepSeek API Key安装CherryStudioMermaid在线编辑器 绘制图表编写提示词在CherryStudio中调用DeepSeek复制源码到Mermaid编辑器中进行微调 图表示例流程图思维导图甘特图 工具准备 创建DeepSeek API Key 打开DeepSeek开放平台, 注册并充值成功后…...
TCP报文段解析:从抽象到具象的趣味学习框架
TCP报文段解析:从抽象到具象的趣味学习框架 一、What:TCP报文段长什么样? 核心结构(类比快递包裹): 复制 下载 | 源端口(16位)| 目的端口(16位)| |-----…...
B+树节点与插入操作
B树节点与插入操作 设计B树节点 在设计B树的数据结构时,我们首先需要定义节点的格式,这将帮助我们理解如何进行插入、删除以及分裂和合并操作。以下是对B树节点设计的详细说明。 节点格式概述 所有的B树节点大小相同,这是为了后续使用自由…...
rollup使用讲解
rollup 总结 什么是 rollup? rollup 是一个 JavaScript 模块打包器,在功能上要完成的事和 webpack 性质一样,就是将小块代码编译成大块复杂的代码,例如 library 或应用程序。在平时开发应用程序时,我们基本上选择用 webpack,相比之下,rollup.js 更多是用于 library 打…...
高边开关和低边开关的区别
高边驱动和低边驱动的区别 在高边驱动和低边驱动中,开关的位置直接影响电路在负载短路时的安全性和电流路径。以下是关键原理的分步解释: 1. 高低边驱动的结构对比 高边驱动(High-Side Drive) 电路结构: 电源正极 →…...
PG psql --single-transaction 参数功能
文章目录 PG psql --single-transaction 参数功能 PG psql --single-transaction 参数功能 test.sql 文件 create table test1(id int); CREATE OR REPLACE FUNCTION func_test() RETURNS INTEGER AS $BODY$ BEGINxxxreturn 0; END; $BODY$ LANGUAGE plpgsql VOLATILE CALLE…...
C++ 多态
1.多态的概念 多态(polymorphism)通俗来说就是多种形态。多态分为编译时多态(静态多态)和运行时多态(动态多态),这里我们重点是运行时多态,编译时多态主要就是我们前面的函数重载和…...
【matlab|python】矢量棍棒图应用场景和代码
【matlab|python】矢量棍棒图应用场景和代码 矢量棍棒图的介绍和作用 矢量棍棒图(stick plot)是一种用于可视化 方向性时间序列数据 的图形工具。它常用于大气科学和海洋科学中,以直观地展示 风场、海流 或 其他矢量变量 随时间的变化情况。 …...
Matlab 五相电机仿真
1、内容简介 Matlab 208-五相电机仿真 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
计算机视觉cv2入门之视频处理
在我们进行计算机视觉任务时,经常会对视频中的图像进行操作,这里我来给大家分享一下,如何cv2中视频文件的操作方法。这里我们主要介绍cv2.VideoCapture函数的基本使用方法。 cv2.VideoCapture函数...
力扣每日一题781题解-算法:贪心,数学公式 - 数据结构:哈希
https://leetcode.cn/problems/rabbits-in-forest/description/?envTypedaily-question&envId2025-04-20 781.推测兔子数 算法:贪心,数学公式 数据结构:哈希 用哈希存每个兔子报告的同色数量,作为key,同个key…...
MAC-QueryWrapper中用的exists,是不是用join效果更好
在使用MyBatis-Plus的QueryWrapper中的exists方法时,是否改为使用join效果会更好,以及如何 修改。这涉及到SQL优化和MyBatis-Plus的用法。 首先,需要理解exists和join在SQL中的区别。exists用于检查子查询是否返回结果,而join则是将 两个表连接起来,根据某些条件合并行…...
使用 Visual Studio 2022 中的 .http 文件
转自微软技术文档: https://learn.microsoft.com/zh-cn/aspnet/core/test/http-files?viewaspnetcore-9.0 Visual Studio 2022.http 文件编辑器提供了一种便捷的方式来测试 ASP.NET Core项目,尤其是 API 应用。 编辑器提供一个 UI,用于&am…...
相得益彰 — 基于 GraphRAG 事理图谱驱动的实时金融行情新闻资讯洞察
*本文为亚马逊云科技博客文章,仅用于技术分享,不构成投资建议或金融决策支持。文中涉及的公司名称仅用于技术示例,不代表亚马逊云科技观点或与这些公司的商业合作关系。 背景介绍 在当今这个信息爆炸的时代,金融市场每天都在产生…...
为什么this与super不能出现在同一构造器的原因
在 Java 中,this() 和 super() 不能同时出现在同一个构造器中,因为它们都必须作为构造器的第一条语句,而一个构造器的第一条语句只能有一个。以下是详细解释和示例: ⚠️ 核心规则 只能二选一: 每个构造器的第一条语句…...
Linux:网络基础
hello,各位小伙伴,本篇文章跟大家一起学习《Linux:网络基础》,感谢大家对我上一篇的支持,如有什么问题,还请多多指教 ! 如果本篇文章对你有帮助,还请各位点点赞!…...
C++入门篇(下)
目录 1、引用 1.1 引用概念 1.2 引用特性 1.3 常引用 1.4 使用场景 1.4.1 引用做参数 1.4.2 引用做返回值 1.5 引用和指针的区别 2、内联函数 2.1 概念 2.2 特性 3、auto关键字 4、基于范围的for循环 5、指针空值nullptr 5.1 C98 中的指针空值处理 5.2 C11 …...
QCustomPlot中自定义QCPAbstractPlottable绘图元素
QCPAbstractPlottable 是 QCustomPlot 中所有可绘制图形(如曲线、柱状图等)的基类。要创建自定义的绘图元素,通常需要继承这个类并实现其纯虚函数。 基本步骤 继承 QCPAbstractPlottable 实现必要的纯虚函数 添加自定义属性和方法 注册到 QCustomPlot 系统 完…...
【Bluedroid】蓝牙 HID 设备信息加载与注册机制及配置缓存系统源码解析
本篇解析Android蓝牙子系统加载配对HID设备的核心流程,通过btif_storage_load_bonded_hid_info实现从NVRAM读取设备属性、验证绑定状态、构造描述符并注册到BTA_HH模块。重点剖析基于ConfigCache的三层存储架构(全局配置/持久设备/临时设备)&…...
【计算机视觉】CV实战项目 - PCC-Net 人群计数
PCC-Net 人群计数项目 项目特点项目运行方式与步骤1. 环境准备2. 数据准备3. 模型训练4. 实验结果 常见问题及解决方法 PCC-Net(Perspective Crowd Counting via Spatial Convolutional Network)是一个用于人群计数的深度学习项目,旨在通过空…...
Towards Transferable Targeted 3D Adversarial Attack in the Physical World--阅读笔记
目录 简介: 背景: 挑战: 目的: 技术细节: 贡献: 1. NeRF的核心作用:3D重建与参数化表示 2. 对抗优化的创新:NeRF参数空间的双优化 2.1 传统方法的局限…...
opencv图像库编程
一、下载安装 opencv 1.1 下载安装包 1.2 解压缩 unzip opencv-3.4.11.zip 解压缩以后主目录文件夹如下: 1.3 进入到解压后的文件夹中 cd opencv-3.4.11 二、使用 cmake安装opencv 2.1 进入 root 用户,并更新一下 sudo su sudo apt-get update …...
星拍相机APP:时尚与科技的完美融合,打造你的专属美
在数字时代,手机相机不仅是记录生活的工具,更是表达个性和创意的平台。今天,我们要介绍的 星拍相机APP,就是这样一款匠心制作的手机相机应用。它融合了时尚与科技,提供了多样化的魔法美颜功能,让每一次拍摄…...
puzzle(0531)脑力航迹
目录 脑力航迹 规则 解法 简单模式 中等模式 困难模式 专家模式 脑力航迹 规则 2条航迹会产生一个相对航迹: 根据相对航迹和其中一个航迹推导另外一个航迹。 解法 没有任何需要推理的地方,就是纯粹的2个矢量相加。 简单模式 中等模式 困难模…...
【英语语法】词法---形容词
目录 形容词1. 形容词的核心功能2. 形容词的位置(1) 前置定语(最常见)(2) 后置定语(特殊情况)(3) 表语位置(系动词后) 3. 形容词的比较级与最高级(1) 规则变化(2) 不规则变化(3) 用法对比 4. 多个形容词修饰…...
理解 React 的 useEffect
文章目录 React 的 useEffect一、什么是副作用(Side Effects)?二、useEffect 的基本用法三、依赖数组的三种情况1. 无依赖数组(每次渲染后都执行, 不推荐)2. 空依赖数组(仅在挂载时执行一次)3. …...
2.1 基于委托的异步编程方法
基于委托的异步编程模型是 .NET 早期版本中实现异步操作的一种方式,主要通过 BeginInvoke 和 EndInvoke 方法来实现。这种基于委托的异步模式已被 Task 和 async/await 模式取代,但在维护旧代码时仍可能遇到这种模式。 委托的方法中:Invoke用于同步调用; 而BeginInvoke与E…...