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

python3使用lxml解析xml时踩坑记录

文章目录

  • 你的 XML 数据
  • 解析 XML
  • ----------------------------
  • 1. 获取 mlt 根元素的属性
  • ----------------------------
  • ----------------------------
  • 2. 获取 chain 元素的属性
  • ----------------------------
  • ----------------------------
  • 3. 获取所有 property 的值
  • ----------------------------
  • ----------------------------
  • 4. 获取所有视频流信息(扩展示例)
  • ----------------------------
  • 根据上面的代码,报错'lxml.etree._Element' object has no attribute 'getroot' 'lxml.etree._ElementTree' object has no attribute 'get'
  • ===================================
  • 正确解析方式选择(二选一):
  • ===================================
  • 方案一:直接解析为 Element (适用于字符串数据)
  • 方案二:使用 ElementTree (适用于文件解析)
  • 如果是文件路径:
  • tree = etree.parse("your_file.xml")
  • root = tree.getroot() # 这才是正确获取根元素的方式
  • ===================================
  • 错误点分析:
  • ===================================
  • 错误用法示例:
  • tree = etree.fromstring(xml_data) # 返回的是 Element
  • root = tree.getroot() # ❌ Element 没有 getroot() 方法
  • ===================================
  • 正确使用示范:
  • ===================================
  • 1. 获取根元素属性
  • 2. 访问子元素
  • 3. 获取 property 值的推荐方式
  • 错误:fromstring 返回的是 Element,没有 getroot()
  • 正确:直接使用
  • 错误:在 ElementTree 对象上直接访问属性
  • 正确:先获取根元素
  • 危险:直接访问可能不存在的元素
  • 安全:添加空值判断
  • 字符串数据解析
  • 文件解析
  • 依据上面回答,采用root = etree.fromstring(xml_data) 的方式,如何遍历根下面的所有子节点
  • 解析 XML 获取根元素
  • ----------------------------
  • 方法一:直接遍历子元素
  • ----------------------------
  • ----------------------------
  • 方法二:通过 XPath 获取所有子节点
  • ----------------------------
  • ----------------------------
  • 方法三:递归遍历所有后代节点
  • ----------------------------
  • 只获取 property 节点
  • 获取名字包含 'media' 的属性节点
    • media_props = root.xpath('//property[contains(@name, "media")]') print("\n包含 'media' 的属性:") for p in media_props: print(f"{p.get('name')}: {p.text}") 4. 输出结果示例 text 复制 所有直接子节点: 标签名: chain 属性: {'id': 'chain0', 'title': 'Shotcut version 25.03.14', 'out': '00:00:31.467'} 文本内容: 无
  • 将属性值转换为 Python 类型

以下是使用 Python 的 lxml 库解析并提取 XML 数据的完整示例代码:

python
复制
from lxml import etree

你的 XML 数据

xml_data = ‘’'<?xml version="1.0" encoding="utf-8"?>

‘’’

解析 XML

root = etree.fromstring(xml_data.encode(‘utf-8’))

----------------------------

1. 获取 mlt 根元素的属性

----------------------------

mlt_attributes = {
‘version’: root.get(‘version’),
‘title’: root.get(‘title’),
‘LC_NUMERIC’: root.get(‘LC_NUMERIC’)
}
print(“MLT 根元素属性:”)
for k, v in mlt_attributes.items():
print(f"{k}: {v}")

----------------------------

2. 获取 chain 元素的属性

----------------------------

chain = root.find(‘chain’)
chain_info = {
‘id’: chain.get(‘id’),
‘title’: chain.get(‘title’),
‘duration’: chain.get(‘out’)
}
print(“\nChain 元素属性:”)
for k, v in chain_info.items():
print(f"{k}: {v}")

----------------------------

3. 获取所有 property 的值

----------------------------

print(“\n关键 Property 列表:”)
properties = [
‘length’, ‘resource’,
‘meta.media.width’, ‘meta.media.height’,
‘meta.media.0.codec.name’, ‘creation_time’
]

for prop_name in properties:
# 使用 XPath 精确查找
prop = chain.xpath(f’property[@name=“{prop_name}”]')
if prop:
print(f"{prop_name}: {prop[0].text}“)
else:
print(f”{prop_name}: Not Found")

----------------------------

4. 获取所有视频流信息(扩展示例)

----------------------------

print(“\n视频流详细信息:”)
for i in range(2): # 根据示例数据有 2 个流
stream_type = chain.xpath(f’property[@name=“meta.media.{i}.stream.type”]‘)
if stream_type:
stream_type = stream_type[0].text
codec_name = chain.xpath(f’property[@name=“meta.media.{i}.codec.name”]’)[0].text
print(f"Stream {i}:“)
print(f” Type: {stream_type}“)
print(f” Codec: {codec_name}")

    if stream_type == 'video':resolution = f"{chain.xpath(f'property[@name="meta.media.{i}.codec.width"]')[0].text}x" \f"{chain.xpath(f'property[@name="meta.media.{i}.codec.height"]')[0].text}"print(f"  Resolution: {resolution}")

代码说明:
XML 解析:使用 etree.fromstring() 解析 XML 字符串

根元素属性:直接通过元素的 get() 方法获取属性值

子元素定位:

find() 用于获取第一个匹配的子元素

xpath() 用于复杂查询(支持完整的 XPath 1.0 语法)

属性提取:

使用 element.get(‘attribute_name’) 获取元素属性

使用 element.text 获取元素文本内容

输出示例:
text
复制
MLT 根元素属性:
version: 7.24.0
title: Shotcut version 25.03.14
LC_NUMERIC: C

Chain 元素属性:
id: chain0
title: Shotcut version 25.03.14
duration: 00:00:31.467

关键 Property 列表:
length: 00:00:31.500
resource: E:/test/video/test_game_video/7.mp4
meta.media.width: 1920
meta.media.height: 1080
meta.media.0.codec.name: h264
creation_time: 2025-02-05T07:19:51

视频流详细信息:
Stream 0:
Type: video
Codec: h264
Resolution: 1920x1080
Stream 1:
Type: audio
Codec: aac
注意事项:
对于需要处理命名空间的 XML,需要注册命名空间

XPath 表达式中的属性值匹配要完全一致(包括大小写)

使用 .encode(‘utf-8’) 确保正确处理中文字符

使用防御性编程检查元素是否存在(示例中简化为直接访问,实际生产环境建议添加校验)

如果需要处理更复杂的 XML 结构或需要其他特定数据提取方式,可以进一步扩展这些基础方法。

根据上面的代码,报错’lxml.etree._Element’ object has no attribute ‘getroot’ ‘lxml.etree._ElementTree’ object has no attribute ‘get’

你遇到的错误是由于混淆了两种不同的 XML 解析对象类型:Element 和 ElementTree。以下是完整解决方案:

python
复制
from lxml import etree

xml_data = ‘’'<?xml version="1.0" encoding="utf-8"?>

‘’’

===================================

正确解析方式选择(二选一):

===================================

方案一:直接解析为 Element (适用于字符串数据)

root = etree.fromstring(xml_data.encode(‘utf-8’)) # 直接得到根元素

方案二:使用 ElementTree (适用于文件解析)

如果是文件路径:

tree = etree.parse(“your_file.xml”)

root = tree.getroot() # 这才是正确获取根元素的方式

===================================

错误点分析:

===================================

错误用法示例:

tree = etree.fromstring(xml_data) # 返回的是 Element

root = tree.getroot() # ❌ Element 没有 getroot() 方法

===================================

正确使用示范:

===================================

1. 获取根元素属性

print(“根元素属性:”)
print(f"版本: {root.get(‘version’)}“) # ✅ 正确访问方式
print(f"标题: {root.get(‘title’)}”)

2. 访问子元素

chain = root.find(‘chain’) # 返回 Element 对象
if chain is not None: # 安全判断
print(“\nChain 元素属性:”)
print(f"ID: {chain.get(‘id’)}“)
print(f"时长: {chain.get(‘out’)}”)

3. 获取 property 值的推荐方式

def get_property(element, name):
“”“安全获取 property 值的辅助函数”“”
prop = element.xpath(f’property[@name=“{name}”]')
return prop[0].text if prop else None

if chain is not None:
print(“\n关键属性值:”)
print(f"视频长度: {get_property(chain, ‘length’)}“)
print(f"文件路径: {get_property(chain, ‘resource’)}”)
print(f"分辨率: {get_property(chain, ‘meta.media.width’)}x{get_property(chain, ‘meta.media.height’)}")
关键区别说明:
方法 返回类型 适用场景 获取根元素方式
etree.fromstring() Element 解析字符串/字节数据 直接返回根元素
etree.parse() ElementTree 解析文件/文件类对象 需要 .getroot()
常见错误场景分析:
错误调用 getroot():

python
复制

错误:fromstring 返回的是 Element,没有 getroot()

root = etree.fromstring(xml_data).getroot() # ❌ 会报错

正确:直接使用

root = etree.fromstring(xml_data) # ✅
混淆对象类型:

python
复制

错误:在 ElementTree 对象上直接访问属性

tree = etree.parse(“file.xml”)
print(tree.get(‘version’)) # ❌ ElementTree 没有 get() 方法

正确:先获取根元素

root = tree.getroot() # ✅
print(root.get(‘version’))
未做空值判断:

python
复制

危险:直接访问可能不存在的元素

print(root.find(‘non_exist_tag’).get(‘attr’)) # ❌ 可能抛出 AttributeError

安全:添加空值判断

element = root.find(‘non_exist_tag’)
if element is not None:
print(element.get(‘attr’))
最佳实践建议:
统一使用方案:

python
复制

字符串数据解析

def parse_xml_string(xml_str):
root = etree.fromstring(xml_str)
# 后续处理 root…

文件解析

def parse_xml_file(file_path):
tree = etree.parse(file_path)
root = tree.getroot()
# 后续处理 root…
使用类型检查:

python
复制
print(type(root)) # 输出:<class ‘lxml.etree._Element’>
print(type(etree.parse(“file.xml”))) # 输出:<class ‘lxml.etree._ElementTree’>
增强错误处理:

python
复制
try:
root = etree.fromstring(xml_data)
chain = root.find(‘chain’)
if chain is None:
raise ValueError(“Chain element not found”)

resource = get_property(chain, 'resource')
print(f"资源路径: {resource}")

except etree.XMLSyntaxError as e:
print(f"XML 解析错误: {e}“)
except Exception as e:
print(f"其他错误: {e}”)
通过以上修正和规范,你可以避免这类对象类型错误,并建立更健壮的 XML 解析代码结构。

依据上面回答,采用root = etree.fromstring(xml_data) 的方式,如何遍历根下面的所有子节点

以下是使用 lxml 的 Element 对象遍历根节点下所有子节点的完整方法,通过逐步分析实现:

  1. 基础遍历方法
    python
    复制
    from lxml import etree

xml_data = ‘’‘<?xml version="1.0" encoding="utf-8"?>


00:00:31.500
E:/test/video/test_game_video/7.mp4

’‘’

解析 XML 获取根元素

root = etree.fromstring(xml_data.encode(‘utf-8’))

----------------------------

方法一:直接遍历子元素

----------------------------

print(“所有直接子节点:”)
for child in root.iterchildren():
print(f"标签名: {child.tag}“)
print(f"属性: {child.attrib}”)
print(f"文本内容: {child.text.strip() if child.text else ‘无’}“)
print(”-" * 30)
2. 扩展遍历方式
2.1 使用 XPath 定位
python
复制

----------------------------

方法二:通过 XPath 获取所有子节点

----------------------------

all_children = root.xpath(‘./*’) # 获取直接子元素
print(f"共找到 {len(all_children)} 个直接子节点")

for idx, element in enumerate(all_children, 1):
print(f"\n节点 {idx}:“)
print(f"标签类型: {element.tag}”)
print(f"属性列表: {element.keys()}“)
if element.attrib.get(‘name’):
print(f"特殊属性 name 的值: {element.get(‘name’)}”)
2.2 深度遍历(递归所有后代)
python
复制

----------------------------

方法三:递归遍历所有后代节点

----------------------------

def traverse(element, depth=0):
prefix = " " * depth
print(f"{prefix}层级 {depth}: [{element.tag}]")
for child in element.iterchildren():
traverse(child, depth + 1)

print(“\n递归遍历结构:”)
traverse(root)
3. 针对特定场景的遍历
3.1 过滤特定标签
python
复制

只获取 property 节点

properties = root.xpath(‘//property’)
print(f"\n找到 {len(properties)} 个 property 节点:“)
for prop in properties:
print(f"属性名: {prop.get(‘name’)} => 值: {prop.text}”)
3.2 带条件的遍历
python
复制

获取名字包含 ‘media’ 的属性节点

media_props = root.xpath(‘//property[contains(@name, “media”)]’)
print(“\n包含 ‘media’ 的属性:”)
for p in media_props:
print(f"{p.get(‘name’)}: {p.text}")
4. 输出结果示例
text
复制
所有直接子节点:
标签名: chain
属性: {‘id’: ‘chain0’, ‘title’: ‘Shotcut version 25.03.14’, ‘out’: ‘00:00:31.467’}
文本内容: 无

共找到 1 个直接子节点

节点 1:
标签类型: chain
属性列表: [‘id’, ‘title’, ‘out’]
特殊属性 name 的值: None

递归遍历结构:
层级 0: [mlt]
层级 1: [chain]
层级 2: [property]
层级 2: [property]

找到 2 个 property 节点:
属性名: length => 值: 00:00:31.500
属性名: resource => 值: E:/test/video/test_game_video/7.mp4

包含 ‘media’ 的属性:
meta.media.width: 1920
meta.media.height: 1080
5. 关键要点总结
方法 特点 适用场景
iterchildren() 直接访问子元素,内存效率高 只需要直接子节点时
XPath ./* 灵活,可配合复杂条件 需要过滤或特殊定位时
递归遍历 获取完整节点结构 需要分析整体文档结构时
XPath 条件过滤 精准定位特定特征节点 提取特定数据时
6. 高级技巧
6.1 处理命名空间
如果 XML 包含命名空间:

python
复制
ns = {‘mlt’: ‘http://example.org/ns’} # 替换为实际的命名空间
chains = root.xpath(‘//mlt:chain’, namespaces=ns)
6.2 性能优化
对于大型 XML 使用 iterparse() 流式解析:

python
复制
context = etree.iterparse(StringIO(xml_data), events=(“start”, “end”))
for event, elem in context:
if event == “start” and elem.tag == “property”:
print(f"找到属性: {elem.get(‘name’)}")
elem.clear() # 及时清理已处理元素
6.3 数据类型转换
python
复制

将属性值转换为 Python 类型

width = int(root.xpath(‘//property[@name=“meta.media.width”]/text()’)[0])
is_progressive = bool(root.xpath(‘//property[@name=“meta.media.progressive”]/text()’)[0] == ‘1’)
通过以上方法,你可以根据具体需求选择最适合的遍历方式。实际应用中建议结合 try-except 块处理可能的节点缺失情况。

相关文章:

python3使用lxml解析xml时踩坑记录

文章目录 你的 XML 数据解析 XML----------------------------1. 获取 mlt 根元素的属性--------------------------------------------------------2. 获取 chain 元素的属性--------------------------------------------------------3. 获取所有 property 的值-------------…...

MySQL 中,查看执行频次、慢查询日志、SHOW PROFILE和 EXPLAIN性能分析和优化

在 MySQL 中,查看执行频次、慢查询日志、SHOW PROFILE 和 EXPLAIN 是性能分析和优化的核心工具。以下是它们的详细用法和高级语法: 一、查看 SQL 执行频次 通过 SHOW STATUS 命令可以查看 SQL 的执行频次,帮助定位高频查询。 1. 查看全局 SQL 执行频次 SHOW GLOBAL STATU…...

芋道 Spring Cloud Alibaba 消息队列 RocketMQ 入门

1. 概述 RocketMQ 是一款开源的分布式消息系统&#xff0c;基于高可用分布式集群技术&#xff0c;提供低延时的、高可靠的消息发布与订阅服务。同时&#xff0c;广泛应用于多个领域&#xff0c;包括异步通信解耦、企业解决方案、金融支付、电信、电子商务、快递物流、广告营销…...

【Go】切片

知识点关键概念切片声明var slice []int初始化切片slice : []int{1,2,3}make() 创建切片make([]int, len, cap)获取长度和容量len(slice), cap(slice)追加元素slice append(slice, value)切片截取slice[start:end]&#xff08;返回子切片&#xff09;拷贝切片copy(dest, src)&…...

html css js网页制作成品——HTML+CSS+js迪奥口红网站网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

PPT 转高精度图片 API 接口

PPT 转高精度图片 API 接口 文件处理 / 图片处理&#xff0c;将 PPT 文件转换为图片序列。 1. 产品功能 支持将 PPT 文件转换为高质量图片序列&#xff1b;支持 .ppt 和 .pptx 格式&#xff1b;保持原始 PPT 的布局和样式&#xff1b;转换后的图片支持永久访问&#xff1b;全…...

python学习笔记--实现简单的爬虫(二)

任务&#xff1a;爬取B站上最爱欢迎的编程课程 网址&#xff1a;编程-哔哩哔哩_bilibili 打开网页的代码模块&#xff0c;如下图&#xff1a; 标题均位于class_"bili-video-card__info--tit"的h3标签中&#xff0c;下面通过代码来实现&#xff0c;需要说明的是URL中…...

【颠覆性缓存架构】Caffeine双引擎缓存实战:CPU和内存双优化,命中率提升到92%,内存减少75%

千万级QPS验证&#xff01;Caffeine智能双缓存实现 92%命中率&#xff0c;内存减少75% 摘要&#xff1a; 本文揭秘千万级流量场景下的缓存革命性方案&#xff01;基于Caffeine打造智能双模式缓存系统&#xff0c;通过冷热数据分离存储与精准资源分配策略&#xff0c;实现CPU利…...

STM32八股【2】-----ARM架构

1、架构包含哪几部分内容 寄存器处理模式流水线MMU指令集中断FPU总线架构 2、以STM32为例进行介绍 2.1 寄存器 寄存器名称作用R0-R3通用寄存器用于数据传递、计算及函数参数传递&#xff1b;R0 也用于存储函数返回值。R4-R12通用寄存器用于存储局部变量&#xff0c;减少频繁…...

智能汽车图像及视频处理方案,支持视频智能包装能力

美摄科技的智能汽车图像及视频处理方案&#xff0c;通过深度学习算法与先进的色彩管理技术&#xff0c;能够自动调整图像中的亮度、对比度、饱和度等关键参数&#xff0c;确保在各种光线条件下&#xff0c;图像都能呈现出最接近人眼的自然色彩与细节层次。这不仅提升了驾驶者的…...

<C#> 详细介绍.net 三种依赖注入:AddTransient、AddScoped、AddSingleton 的区别

在 .NET 8 里&#xff0c;AddTransient、AddScoped 和 AddSingleton 均为依赖注入容器用于注册服务的方法&#xff0c;不过它们的生命周期管理方式存在差异。下面为你详细介绍这三种方法的区别。 1. AddTransient AddTransient 方法所注册的服务&#xff0c;每次被请求时都会…...

jenkins+1panel面板java运行环境自动化部署java项目

本文章不包含1panel面板安装、jenkins部署、jenkins连接git服务器等操作教程&#xff0c;如有需要可以抽空后期补上 jenkins安装插件Publish Over SSH 在系统配置添加服务器 查看项目的工作空间 项目Configure->构Post Steps选择Send files or execute commands over SSH…...

C语言 【实现电脑关机小游戏】非常好玩

引言 在时间限制内做出正确的回答&#xff0c;时间一到&#xff0c;电脑自动关机&#xff0c;听起来是不是很有意思&#xff0c;下面来看看怎么实现吧。 注意&#xff1a;该游戏只在windows系统下可以玩&#xff0c; 一、游戏原理&#xff1a; 在Windows系统下&#xff0c;通…...

备份比赛数据【算法赛】

0备份比赛数据【算法赛】 - 蓝桥云课 问题描述 蓝桥杯大赛的组委会最近遇到了一个棘手的问题。他们有 N 台电脑需要备份比赛数据&#xff0c;每台电脑所需的备份时间分别为 A1​,A2​,…,AN​ 分钟。 备份必须按编号顺序依次进行&#xff0c;即先第 1 台&#xff0c;再第 2 …...

[网络安全] 滥用Azure内置Contributor角色横向移动至Azure VM

本文来源于团队的超辉老师&#xff0c;其系统分析了Azure RBAC角色模型及其在权限滥用场景下的攻击路径。通过利用AADInternals工具提升用户至Contributor角色&#xff0c;攻击者可在Azure VM中远程执行命令&#xff0c;创建后门账户&#xff0c;实现横向移动。文中详述了攻击步…...

人工智能(AI)系统化学习路线

一、为什么需要系统化学习AI&#xff1f; 人工智能技术正在重塑各行各业&#xff0c;但许多初学者容易陷入误区&#xff1a; ❌ 盲目跟风&#xff1a;直接学习TensorFlow/PyTorch&#xff0c;忽视数学与算法基础。 ❌ 纸上谈兵&#xff1a;只看理论不写代码&#xff0c;无法解…...

Ubuntu系统使用nmcli配置静态IP

1. 配置静态IP 以下命令请全部加上sudo, 否则很可能会报错&#xff01;&#xff01;&#xff01; 列出可用的网络连接 nmcli connection show找到你的 WiFi 连接名称&#xff08;如 "WiFi名称"&#xff09;。 设置静态 IP 地址、网关和 DNS nmcli connection modif…...

vue3,element-plus 表格单选、多选、反选、全选

准备 定义数据 // 表格 const table ref(); // 表格数据 import type { User } from "/interface"; const tableData ref<User[]>([]); // 表格选集 const tableSelection ref<User[]>([]); // 表格选择行 const tableSelectedRow ref<User>…...

ngx_http_core_server_name

定义在 src\http\ngx_http_core_module.c static char * ngx_http_core_server_name(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) {ngx_http_core_srv_conf_t *cscf conf;u_char ch;ngx_str_t *value;ngx_uint_t i;ngx_…...

如何提升库存系统的高并发和稳定性:算法与设计模式

库存系统是企业运营的核心模块&#xff0c;尤其是在电商、零售和供应链管理中&#xff0c;系统的高并发和稳定性直接影响订单处理的准确性和效率。面对海量订单、复杂的库存管理需求&#xff0c;如何在高并发环境下确保库存数据的准确性和系统的稳定性&#xff1f;本文将从架构…...

【Linux】从开发到系统管理深入理解环境变量

文章目录 前言一、环境变量概念1.1 为什么需要环境变量&#xff1f;1.2 环境变量的本质特征 二、环境变量PATH2.1 PATH的运作机制2.2 常见环境变量及其作用2.3 环境变量操作指南 三、再谈环境变量3.1main函数命令行参数解析3.2 环境变量的继承机制3.3 本地变量与内部构建命令 总…...

C++相关

1.定义pos时最好用无符号整型 如uint8_t size_t 编译器可能会有&#xff08;有符号/无符号不匹配&#xff09;的警告 总的来说就是符号一致 2.遇到俩个lambda相互调用的情况 使用std:funtion前置声明 3.回顾了虚函数&#xff0c;定义virtual 就是虚函数 一般是父类指针指向子…...

智算中心系统化建设与运营框架

智算中心系统化建设与运营框架 围绕智算中心全生命周期&#xff0c;从政策驱动到技术落地构建完整解决方案&#xff1a; 一、政策与产业生态 政策支撑体系 算力补贴机制&#xff1a; 国家层面&#xff1a;工信部“东数西算”工程对西部智算中心给予电价优惠&#xff08;0.3元/…...

空气质量查询API:助力健康生活与环境监测的智能工具

引言 随着工业化和城市化的快速发展&#xff0c;空气质量问题日益受到人们的关注。空气质量不仅影响我们的日常生活&#xff0c;还直接关系到我们的健康。因此&#xff0c;了解空气质量指数&#xff08;AQI&#xff09;以及各项污染物的浓度&#xff0c;对于保障人们的健康至关…...

【CGE】社会核算矩阵构建(一):SAM基本结构

【CGE】社会核算矩阵构建&#xff08;一&#xff09;&#xff1a;SAM基本结构 社会核算矩阵构建&#xff08;一&#xff09;&#xff1a;SAM基本结构一、SAM的概念和基本特点二、SAM的基本结构1.开放经济体的SAM表结构2.SAM表各账户的主要核算内容&#xff08;1&#xff09;社会…...

Ubuntu 系统部署 Ollama + DeepSeek + Docker + Ragflow

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; Mysql数据库规范 一、Ol…...

深入探究 JVM 堆的垃圾回收机制(二)— 回收

GC Roots 枚举需要遍历整个应用程序的上下文&#xff0c;而在进行可达性分析或者垃圾回收时&#xff0c;如果我们还是进行全堆扫描及收集&#xff0c;那么会非常耗时。JVM 将堆分为新生代及老生代&#xff0c;它们的回收频率及算法不一样。 1 回收算法 在进行可达性分析时&am…...

第三讲 | C/C++内存管理完全手册

C/C内存管理 一、 C/C内存分布二、 C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free三、 C内存管理方式1. new/delete操作内置类型2. new和delete操作自定义类型 四、operator new和operator delete函数&#xff08;重点&#xff09;五、new和delete的实现原理…...

2021年蓝桥杯第十二届CC++大学B组真题及代码

目录 1A&#xff1a;空间&#xff08;填空5分_单位转换&#xff09; 2B&#xff1a;卡片&#xff08;填空5分_模拟&#xff09; 3C&#xff1a;直线&#xff08;填空10分_数学排序&#xff09; 4D&#xff1a;货物摆放&#xff08;填空10分_质因数&#xff09; 5E&#xf…...

秒杀业务优化之从分布式锁到基于消息队列的异步秒杀

一、业务场景介绍 优惠券、门票等限时抢购常常出现在各类应用中&#xff0c;这样的业务一般为了引流宣传而降低利润&#xff0c;所以一旦出现问题将造成较大损失&#xff0c;那么在业务中就要求我们对这类型商品严格限时、限量、每位用户限一次、准确无误的创建订单&#xff0c…...