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

支持高性能结构化数据提取的 Embedding 模型——NuExtract-v1.5

NuExtract 是一个用户友好型模型,设计用于从长文档中提取信息。它可以处理长达 20,000 个标记的输入,是合同、报告和其他商业通信的理想选择。NuExtract 的与众不同之处在于它能够处理和理解文档的整个上下文。这意味着它可以捕捉到可能分散在长文本不同部分的关系和信息。

NuExtract 具有高效性和可扩展性。它可以管理大量文本数据,而不需要更多的计算能力,这对于同时处理多个长文档来说非常有利。这种效率得益于它的文本到文本模型架构,也就是善于理解和总结文本的花哨说法。
NuExtract 的另一个亮点是它的多功能性。它可以使用 JSON 模板提取各种结构化信息。因此,无论是姓名、日期、地点还是其他重要细节,NuExtract 都能为你找到并组织这些信息。

总之,NuExtract 就像一个超级高效的全能助手,能帮你理清冗长复杂的文档,准确提取出你需要的信息。

多语言能力

我们收到的最常见请求之一是让 NuExtract 能够处理英语以外的语言。 为此,我们需要一个多语言数据集和一个多语言基础模型。 幸运的是,Phi-3.5 mini 最近在这方面取得了很大进展,现在可以处理阿拉伯语、中文、捷克语、丹麦语、荷兰语、英语、芬兰语、法语、德语、希伯来语、匈牙利语、意大利语、日语、韩语、挪威语、波兰语、葡萄牙语、俄语、西班牙语、瑞典语、泰语、土耳其语和乌克兰语。 我们选择 Phi-3.5 mini 作为 NuExtract 的基础。

对于训练数据集,我们需要原始文档。 我们再次从 C4 数据集中获取这些文档。 我们选择了 50% 的英文文档和 50% 的其他语言文档(主要是法语、德语、西班牙语、意大利语和葡萄牙语)。 为了让 NuExtract 能正确处理长文档,我们还加入了比原始 NuExtract 更长的文档。

我们需要对这些文档进行注释,这意味着要为每份文档生成模板和输出。 现在有一个重要的问题:模板应该使用哪种语言? 我们选择对一半的文档使用英文模板,而另一半文档则使用与文档相同的语言。 这样,当用户需要处理多种语言的文档时,就可以创建一个独特的英文模板。 然后,我们使用与 NuExtract 相同的自动注释程序。 下面是一个带有英文模板的法文文档示例:

在这里插入图片描述
请注意,与最初的 NuExtract 一样,该数据集仍然是纯粹的提取型:我们训练模型复制粘贴文档的部分内容,而不是生成任何新内容。 我们打算在下一个版本中增加抽象/重构能力。

无限语境

由于使用了 Phi-3.5 mini 作为基础模型,NuExtract 1.5 现在的上下文大小为 128k 标记(约 200 页),这对于绝大多数应用来说应该足够了。 尽管如此,仍然存在一个问题:使用这样的转换器模型处理长文档需要消耗大量内存(和计算量),因为每个标记都需要在其他标记之上进行处理。 以下是 NuExtract 在处理给定长度的序列时所需要的 GPU 内存:

在这里插入图片描述
我们可以看到,对于小于 10,000 个标记的序列,内存主要用于存储约 10GB 的模型。 然而,超过 10,000 个标记后,我们就进入了二次扩展阶段(存储标记-标记注意力分数)。 最大 128k 标记上下文需要 1TB 的 GPU 内存! 这意味着,对于小于10,000个字节的序列,像L4这样的标准GPU就可以为NuExtract提供服务,而对于更长的序列,我们则需要多个高端昂贵的GPU。

为了解决长序列的内存问题,我们采用了一种独创的解决方案:我们训练NuExtract,使其能够在获得先前信息的情况下从文档中提取信息。 为了让 NuExtract 1.5 具备这种能力,我们在数据集中添加了新的示例,这些示例都提供了先前的信息,例如

在这里插入图片描述
持续提取示例。 输出结果来自文本、模板和之前提取的信息。 请注意,这里的温度值会被覆盖。 (注:此示例仅供参考,不作为训练集的一部分)。

有了这样的例子,模型就应该学会合并以前的信息和新信息。 这种合并并非易事,有时会出现信息冲突。

这种 "延续 "能力允许我们在通过滑动上下文窗口处理文本时,通过迭代重新注入当前信息状态来处理任意长的文档,这让人联想到递归神经网络。 这个过程的好处在于,内存占用受窗口大小的限制。 下面是一个 10k 的提取窗口所需的内存,假设输出大小恒定为 2k 左右:

在这里插入图片描述
使用 NuExtract 的 GPU 内存需求比较:全提取窗口和 10k 标记提取窗口,2k 标记输出。

我们看到,无论文档大小如何,内存现在都小于 30GB。

这种策略的缺点是需要多次生成输出,如果滑动窗口太小,性能就会下降(见结果部分)。 此外,这种方法只有在输出比文档小很多的情况下才会起作用,而长文档通常就是这种情况。

英语性能

我们先来看看训练有素的模型在英语基准测试中的性能。 该基准由来自 12 个提取问题的 600 个示例组成,涵盖各种使用情况。 在现阶段,它仍然是一个实验性基准,但对于比较模型已经非常有用(我们计划在完成后公开发布)。 请注意,该基准还测试了 NuExtract 尚不具备的抽象能力。

在这里插入图片描述
我们可以看到,NuExtract 1.5 比原来的 NuExtract 要好得多。 此外,NuExtract 甚至比 GPT-4o 还要好一些!

现在我们来看看模型访问输入-输出示例时的结果。 我们使用与之前相同的基准,并在 12 个问题中的每个问题的 45 个示例上对 NuExtract 1.5 进行微调。 我们还通过将所有 45 个示例都放入提示中(又称上下文学习)来对 GPT-4o 进行基准测试,之所以能做到这一点,是因为我们的基准示例都很短,通常只有 1k 个词组,这意味着提示内容约为 50k 个词组:

在这里插入图片描述
不出所料,所有模型都大幅提高了性能(阴影部分)。 我们可以看到,GPT-4o 现在比 NuExtract 1.5 好,但好得不多。 值得注意的另一点是,NuExtract 1.5 比 NuExtract 1.5 tiny 要好得多,这暗示着更大的 NuExtract 很大程度上可以击败 GPT-4o。 有待证实…

总体而言,NuExtract 1.5 和 GPT-4o 在零次和多次运行情况下的性能非常相似。 令人惊讶的是,一个小 500 倍且不具备抽象能力的模型竟然能与如此强大的前沿模型相媲美。 我们认为这有三个原因。 首先,通过只关注结构化提取任务,NuExtract 能够重新分配一些权重以提高文本理解能力。 其次,训练程序能够迫使 NuExtract 精确地遵循模板,并只返回 JSON 输出。 最后但并非最不重要的一点是,通过强制模型提取部分输入文本并在必要时训练其返回空结果,我们的训练大大减少了幻觉。

多语言性能

现在让我们来看看多语言基准的性能(每种语言包含 250 个文档,由英语基准的一部分翻译而来):

在这里插入图片描述
我们看到,NuExtract 1.5 比原始 NuExtract 要好得多,但在这种情况下,GPT-4o 仍然更好。 我们认为,模型的大小对多语言性相当重要(我们无法将微小的 NuExtract 训练成多语言模型的事实证实了这一点)。 我们可能会用更大的 NuExtract 来填补这一空白。

长文档性能

最后,让我们来看看长文档的性能。 我们首先测试的是 8k-10ktoken 范围内的文档(约 20 页),因为我们无需滑动窗口即可轻松处理这些文档:

在这里插入图片描述
结果令人印象深刻: NuExtract 1.5 优于 GPT-4o! 我们应该注意到,这一机制中的基准并不像较小文档那样完整和多样化,但它仍然表明 NuExtract 1.5 非常善于处理长文档(这也证明了 Phi-3.5 mini 对长上下文的正确处理)。 我们还发现,NuExtract 1.5 tiny 比 NuExtract 1.5 差很多,目前我们还不能确定这仅仅是由于模型大小造成的,还是由于使用的基础模型造成的。 现在我们测试更长的文档,在 10k-20k tokens 范围内。 这次我们必须设置 10k 的提取窗口,以保持内存可控:

在这里插入图片描述
同样,NuExtract 1.5 是性能最好的模型,即使在提取窗口缩小的情况下也是如此,这表明之前的结果并非偶然。 这也表明–至少在 10k 个词组的窗口大小下–延续策略运行良好。 现在我们来分析提取窗口大小对性能的影响。 我们再次使用 8k-10k 个词组的基准:

在这里插入图片描述
我们可以看到,NuExtract 1.5 的性能随着提取窗口大小的减小而降低,但幅度不大! NuExtract 1.5 的性能比 GPT-4 差,但仍比 NuExtract 1.5 的微小窗口好得多。 使用小窗口可减少内存:全窗口为 20GB,而 2k 窗口为 10GB(其中大部分是模型权重)。 对于较长的序列,这一比例会变得更大。

使用这样的延续程序并不完美,当然也有改进的方法,但它避免了在所需内存大于 GPU 内存时简单地失败。 我们的推理模块(企业解决方案的一部分,请联系我们😊)会根据给定的 GPU 内存自动调整窗口大小。

numind/NuExtract-v1.5

NuExtract-v1.5 是对 Phi-3.5-mini-instruct 的微调,在一个用于结构化信息提取的私有高质量数据集上进行了训练。 它支持长文档和多种语言(英语、法语、西班牙语、德语、葡萄牙语和意大利语)。 要使用该模型,请提供输入文本和描述所需提取信息的 JSON 模板。

注:该模型经过训练,优先提取纯文本,因此在大多数情况下,该模型生成的所有文本都与原文一致。

还提供基于 Qwen2.5-0.5B 的微小(0.5B)版本: NuExtract-tiny-v1.5

import json
from transformers import AutoModelForCausalLM, AutoTokenizerdef predict_NuExtract(model, tokenizer, texts, template, batch_size=1, max_length=10_000, max_new_tokens=4_000):template = json.dumps(json.loads(template), indent=4)prompts = [f"""<|input|>\n### Template:\n{template}\n### Text:\n{text}\n\n<|output|>""" for text in texts]outputs = []with torch.no_grad():for i in range(0, len(prompts), batch_size):batch_prompts = prompts[i:i+batch_size]batch_encodings = tokenizer(batch_prompts, return_tensors="pt", truncation=True, padding=True, max_length=max_length).to(model.device)pred_ids = model.generate(**batch_encodings, max_new_tokens=max_new_tokens)outputs += tokenizer.batch_decode(pred_ids, skip_special_tokens=True)return [output.split("<|output|>")[1] for output in outputs]model_name = "numind/NuExtract-v1.5"
device = "cuda"
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.bfloat16, trust_remote_code=True).to(device).eval()
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)text = """We introduce Mistral 7B, a 7–billion-parameter language model engineered for
superior performance and efficiency. Mistral 7B outperforms the best open 13B
model (Llama 2) across all evaluated benchmarks, and the best released 34B
model (Llama 1) in reasoning, mathematics, and code generation. Our model
leverages grouped-query attention (GQA) for faster inference, coupled with sliding
window attention (SWA) to effectively handle sequences of arbitrary length with a
reduced inference cost. We also provide a model fine-tuned to follow instructions,
Mistral 7B – Instruct, that surpasses Llama 2 13B – chat model both on human and
automated benchmarks. Our models are released under the Apache 2.0 license.
Code: <https://github.com/mistralai/mistral-src>
Webpage: <https://mistral.ai/news/announcing-mistral-7b/>"""template = """{"Model": {"Name": "","Number of parameters": "","Number of max token": "","Architecture": []},"Usage": {"Use case": [],"Licence": ""}
}"""prediction = predict_NuExtract(model, tokenizer, [text], template)[0]
print(prediction)

滑动窗口提示:

import jsonMAX_INPUT_SIZE = 20_000
MAX_NEW_TOKENS = 6000def clean_json_text(text):text = text.strip()text = text.replace("\#", "#").replace("\&", "&")return textdef predict_chunk(text, template, current, model, tokenizer):current = clean_json_text(current)input_llm =  f"<|input|>\n### Template:\n{template}\n### Current:\n{current}\n### Text:\n{text}\n\n<|output|>" + "{"input_ids = tokenizer(input_llm, return_tensors="pt", truncation=True, max_length=MAX_INPUT_SIZE).to("cuda")output = tokenizer.decode(model.generate(**input_ids, max_new_tokens=MAX_NEW_TOKENS)[0], skip_special_tokens=True)return clean_json_text(output.split("<|output|>")[1])def split_document(document, window_size, overlap):tokens = tokenizer.tokenize(document)print(f"\tLength of document: {len(tokens)} tokens")chunks = []if len(tokens) > window_size:for i in range(0, len(tokens), window_size-overlap):print(f"\t{i} to {i + len(tokens[i:i + window_size])}")chunk = tokenizer.convert_tokens_to_string(tokens[i:i + window_size])chunks.append(chunk)if i + len(tokens[i:i + window_size]) >= len(tokens):breakelse:chunks.append(document)print(f"\tSplit into {len(chunks)} chunks")return chunksdef handle_broken_output(pred, prev):try:if all([(v in ["", []]) for v in json.loads(pred).values()]):# if empty json, return previouspred = prevexcept:# if broken json, return previouspred = prevreturn preddef sliding_window_prediction(text, template, model, tokenizer, window_size=4000, overlap=128):# split text into chunks of n tokenstokens = tokenizer.tokenize(text)chunks = split_document(text, window_size, overlap)# iterate over text chunksprev = templatefor i, chunk in enumerate(chunks):print(f"Processing chunk {i}...")pred = predict_chunk(chunk, template, prev, model, tokenizer)# handle broken outputpred = handle_broken_output(pred, prev)# iterateprev = predreturn pred

相关文章:

支持高性能结构化数据提取的 Embedding 模型——NuExtract-v1.5

NuExtract 是一个用户友好型模型&#xff0c;设计用于从长文档中提取信息。它可以处理长达 20,000 个标记的输入&#xff0c;是合同、报告和其他商业通信的理想选择。NuExtract 的与众不同之处在于它能够处理和理解文档的整个上下文。这意味着它可以捕捉到可能分散在长文本不同…...

【C#】设计一个选购计算机配置的应用程序

文章目录 1. 创建新的 Windows Forms 应用程序项目2. 设计界面2.1 添加控件和设置属性 3. 编写事件处理代码4. 运行和测试应用程序 1. 创建新的 Windows Forms 应用程序项目 打开 Visual Studio。选择“创建新项目”。在项目类型中选择“Windows Forms 应用程序”&#xff08;…...

solo博客源码使用idea编译运行

solo博客源码使用idea编译运行 solo博客开源地址本地运行IDEA 编译执行默认直接编译jar 包编译 solo博客开源地址 项目地址&#xff1a;GitHub - 88250/solo: &#x1f3b8; B3log 分布式社区的 Java 博客端节点系统&#xff0c;欢迎加入下一代社区网络。B3log distributed co…...

VBA07-方法

一、方法的定义 方法指对象所能执行的动作&#xff0c;它是一个动词。 二、方法的表达方式 三、关于工作簿的方法操作 3-1、新增一个工作簿 示例1&#xff1a; 此时&#xff0c;新增的工作簿的名字是系统默认的。 示例2&#xff1a; 【注意】&#xff1a; 当你尝试将工作簿…...

spring boot 统一异常处理

在 Spring Boot 应用中实现统一异常处理是非常重要的&#xff0c;它可以帮助我们更好地管理和响应应用程序中的错误。通过使用 ControllerAdvice 和 ExceptionHandler 注解&#xff0c;我们可以创建一个全局的异常处理器来捕获并处理不同类型的异常。 步骤 1: 创建一个异常处理…...

跟着小土堆学习pytorch(六)——神经网络的基本骨架(nn.model)

文章目录 一、model介绍二、Module三、张量3.1 定义3.2 用法 一、model介绍 容器 Containers 卷积层 Convolution Layers 池化层 Pooling layers 填…...

数字化落地过程中的研发效能治理如何开展?

数字化落地过程中&#xff0c;针对数字化识别到的问题和短板进行专项治理&#xff0c;是通过数字化手段持续提升研发效能非常重要的一环。组织级的数字化专项治理需要组织级团队和技术团队共同配合协同来完成。其中组织级团队负责制定整体的治理目标、流程和策略&#xff0c;根…...

Windows安装配置node.js

下载安装 下载 访问下载 | Node.js 中文网&#xff0c;下载 推荐使用长期支持版本&#xff0c;但是此次是学习用的&#xff0c;使用最新版本试一下 安装 其实一路next基本就可以了&#xff0c;注意调整下安装目录 查看版本 C:\Users\PC>node -v v22.11.0 C:\Users\PC>…...

Javaweb梳理9——JDBC

Javaweb梳理9——JDBC 1.JDBC概述1.1 JDBC概念1.2 JDBC本质1.3 JDBC好处 2.JDBC快速入门2.1 编写代码步骤2.2 具体操作 3 JDBC API详解3.1 DriverManager3.2 Connection3.2.1 获取执行对象3.2.2 事务管理 3.3 Statement3.3.1 概述3.3.2 代码实现 3.4 ResultSet3.4.1 概述3.4.2 …...

逆向CTF入门(如何找main)

Hello, world of reverse! start函数它在执行一些初始化操作,如获取命令行参数、获取环境变量值、初始化全局变量等&#xff0c;一切准备工作完成之后&#xff0c;再调用main函数 快速定位关键函数&#xff1a; 长驱直入法&#xff1a;当程序功能非常明确时&#xff0c;从程序…...

c语言归并排序

归并排序思想&#xff1a; 归并排序可以解释为是将放在数组里的一串数字进行拆分&#xff0c;拆分之后再判断大小合并的过程&#xff0c;每次都是从中间位置拆分&#xff0c;例如有七个数&#xff0c;第一次拆分就将它们分成前三个数为一个数组&#xff0c;后四个数为一个数组&…...

碳化硅陶瓷膜的特性

无机膜包括金属膜、陶瓷膜、玻璃膜等等&#xff0c;其中在水处理领域里出镜最多、应用最广的当属陶瓷膜。比起高分子有机膜&#xff0c;陶瓷膜硬度更高、通量更大、寿命更长&#xff0c;然其性能优越&#xff0c;成本也很“高昂”&#xff0c;故其生存空间自然是受到高分子有机…...

机器学习(三)——决策树(附核心思想、重要算法、概念(信息熵、基尼指数、剪枝处理)及Python源码)

目录 关于1 基本流程2 划分属性的选择2.1 方法一&#xff1a;依据信息增益选择2.2 方法二&#xff1a;依据增益率选择2.3 方法三&#xff1a;依据基尼指数选择 3 剪枝处理&#xff1a;防止过拟合3.1 预剪枝3.2 后剪枝 4 连续与缺失值4.1 连续值处理4.2 缺失值处理 5 多变量决策…...

良心无广,这五款电脑软件堪称必备,最后一个比快播都猛

来吧&#xff0c;直接上狠货&#xff01; 哔哔音乐 这是一个基于哔哩哔哩开发的电脑听歌软件&#xff0c;众所周知&#xff01;B站其实就是一个巨大的曲库&#xff0c;啥歌各种版本都能在这里找到。 所以如果依托B站开发听歌软件&#xff0c;那就是真的香&#xff0c;而且软件…...

Vue3中实现原生CSS完成圆形按钮点击粒子效果和定点旋转动画

效果&#xff1a; 源码&#xff1a; <script setup> import { ElMessage } from "element-plus"; const isClick () > {ElMessage.success(Clicked); }; </script><template><button click"isClick" class"button">…...

百度网盘 服务器开小差了

有会员&#xff0c;新上传文件到百度网盘&#xff0c;分享链接&#xff0c; 别人打开链接&#xff0c;显示【服务器开小差了&#xff0c;请稍后重试~】&#xff0c;保存不了 试了几个都不行&#xff0c;文件是视频MP4 可行的方法是百度网盘加好友&#xff0c;然后在聊天页面单…...

数据分析师招聘要求

在当今数据驱动的世界中&#xff0c;数据分析师的角色变得愈发重要&#xff0c;他们被赋予从海量数据中提炼洞察的关键任务。数据分析师的招聘要求反映了这个职位多方面的需求&#xff0c;从教育背景到技能&#xff0c;再到软技能和行业特有的知识。本文将详细探讨这些要求&…...

【C语言】实战-力扣题库:回文链表

题目描述 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 提示&#xff1a; 链表中节点数目在范围[1, 105] 内0 < Node.val < 9 进阶&#xff1a;你能否用 O(n) 时间…...

Centos安装Minio

文章目录 1 远程下载二进制文件2 创建目录&#xff1a;文件存储、日志3 授权执行4 启动5 创建配置文件6 注册服务并开机自启7 创建key附录参考文档 1 远程下载二进制文件 [rootlocalhost bin]# cd /opt/package [rootlocalhost package]# wget https://dl.min.io/server/minio…...

二叉树的基本概念和底层实现

1. 树型结构 1.1 认识树 在学习二叉树之前我们需要了解一下树型结构 树是一种非线性的数据结构,它是由n个结点组成的一个有层次关系的集合,看起来像个倒挂的树,也就是根朝上,枝叶朝下. 特点: 1. 根结点没有前驱结点 2. 除了根结点外其他的结点被分为互不相交的集合,每个集合又…...

GIF图片格式详解(三)

gif历史部分介绍请参考上一篇《GIF图片格式详解&#xff08;一&#xff09;》&#xff0c; 格式部分详解参考 《GIF图片格式详解&#xff08;二&#xff09;》 或直接访问博客地址&#xff1a;https://blog.whatsroot.xyz/2023/12/16/all-about-gif/ 本篇介绍下用于处理gif图…...

类和对象相关题

文章目录 1. 求123...n2. 计算是这一年的第几天3. 求两个日期之间的天数4. 算出第n天是几月几号5. 计算一个日期加上若干天后是什么日期 1. 求123…n 求123…n&#xff0c;要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句&#xff08;A?B:C&a…...

Word大珩助手:超大数字怎么读?35位数字?69位数字?

俄罗斯日前对谷歌开出了20000000000000000000000000000000000&#xff08;35位数字&#xff09;美元的罚款 这一数字远超全球GDP总和&#xff0c;消息一出很快就登上热搜。 面对这样一个庞大的数字&#xff0c;人们不禁好奇&#xff0c;这样的数字该如何读出来&#xff1f; …...

阿里云k8s-master部署CNI网络插件遇到的问题

问题 按照网络上的部署方法 cd /opt/k8s # 下载 calico-kube-controllers配置文件&#xff0c;可能会网络超时 curl https://docs.projectcalico.org/manifests/calico.yaml -O kubectl apply -f calico.yaml 试了很多次都不行&#xff0c;k8s-master都是Not ready的状态 ca…...

【LwIP源码学习4】主线程tcpip_thread

前言 本文对lwip的主要线程tcpip_thread进行分析。 正文 tcpip_thread是lwip最主要的线程&#xff0c;其创建在tcpip_init函数中 sys_thread_new(TCPIP_THREAD_NAME, tcpip_thread, NULL, TCPIP_THREAD_STACKSIZE, TCPIP_THREAD_PRIO);tcpip_init函数被TCPIP_Init函数调用。…...

求猫用宠物空气净化器推荐,有没有吸毛强、噪音小的产品

自从成为铲屎官&#xff0c;真的和当妈没有区别了。家里的毛孩子成天掉毛&#xff0c;我就跟在它屁股后面默默收拾&#xff0c;一举一动都要时刻关注。最近换季&#xff0c;家里还多了不少浮毛&#xff0c;全飘在空气中&#xff0c;阳光照射下非常明显。 我妈看到后各种吐槽&a…...

pycharm中python控制台出现CommandNotFoundError: No command ‘conda run‘.

1、错误现象 pycharm中打开python控制台出现CommandNotFoundError: No command conda run.的错误。 2、背景 conda是4.6版本&#xff0c;在Anaconda Prompt可以正常运行虚拟环境。 3、解决方法 更新conda版本&#xff0c;基本命令&#xff0c;会自动更新到最新版本。 con…...

架构师备考-架构基本概念

目录 基本概念 架构设计与生命周期 需求分析 设计阶段 实现阶段 构件组装阶段 部署阶段 后开发阶段 动态软件体系结构 体系结构恢复与重建 软件架构设计的重要性 基本概念 软件架构&#xff08;Software Architecture&#xff09;设计主要关注软件构件的结构、属性和…...

信奥赛C++知识点

参加信息学奥林匹克竞赛&#xff08;信奥赛&#xff09;所需学习的C知识点&#xff0c;以下是一个详细的知识点列表&#xff1a; 一、C语言基础 程序结构 头文件&#xff1a;包含必要的头文件&#xff0c;如<iostream>用于输入输出。 命名空间&#xff1a;使用using …...

高并发内存池扩展 -- 处理大内存,优化释放时需要传入空间大小,加入定长内存池,存放映射关系的容器的锁机制,优化性能(基数树,优势,优化前后对比)

目录 高并发内存池 扩展 测试 大内存 介绍 代码 优化释放时需要传入空间大小 介绍 赋值 代码 加入定长内存池 引入 介绍 代码 存放映射关系的容器 锁机制 写入 读取 优化性能 引入 基数树 单级基数树 两级基数树 三级基数树 优势 引入代码 优化前后…...