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

xAI Elasticsearch 集群架构解析:索引数据规模与分片优化实践

Elasticsearch(ES)作为分布式搜索和分析引擎,是 xAI 构建高性能数据处理系统的基石。xAI 的业务场景,如实时日志分析、模型训练数据检索和用户行为分析,要求 Elasticsearch 集群兼顾高吞吐写入、低延迟查询和动态扩展能力。本文以 xAI 的 Elasticsearch 集群架构为核心,详细探讨其设计理念、索引数据规模、分片策略和优化实践,结合 Java 代码实现一个集群状态监控工具。


一、xAI Elasticsearch 集群架构概述

1. 集群设计目标

xAI 的 Elasticsearch 集群服务于多种业务场景,设计目标包括:

  • 高可用性:支持节点故障后快速恢复,确保服务不中断。
  • 高性能:实现亚秒级查询和百万级每秒写入。
  • 可扩展性:动态增加节点以应对数据增长。
  • 成本效率:优化存储和计算资源,降低运营成本。
  • 一致性:保证数据在分布式环境中的强一致性。

2. 集群架构组成

xAI 的 Elasticsearch 集群采用多角色节点设计,分为以下类型:

  • 主节点(Master Nodes)
    • 负责集群状态管理、分片分配和索引操作。
    • 配置:3 个专用主节点,4 核 8GB 内存,SSD 磁盘。
  • 数据节点(Data Nodes)
    • 存储索引数据,执行写入和查询。
    • 配置:10-20 个节点,16 核 64GB 内存,2TB NVMe SSD。
    • 冷热分离:热节点(SSD)处理实时数据,冷节点(HDD)存历史数据。
  • 协调节点(Coordinating Nodes)
    • 负载均衡查询请求,合并搜索结果。
    • 配置:4 个节点,8 核 32GB 内存。
  • 摄入节点(Ingest Nodes)
    • 预处理数据(如日志清洗)。
    • 配置:2 个节点,8 核 16GB 内存。

集群规模

  • 节点总数:20-30(动态调整)。
  • 集群存储:约 50TB(热数据 10TB,冷数据 40TB)。
  • 索引总数:约 500 个(时间分片为主)。
  • 分片总数:约 5000 个(主分片 + 副本)。

3. 索引数据规模

xAI 的索引数据量由业务驱动,主要包括:

  • 日志数据:每天生成 1TB,保留 30 天(热)+ 90 天(冷),总计约 30TB。
  • 模型元数据:约 5TB,长期存储,增长缓慢。
  • 用户行为数据:每天 500GB,保留 60 天,总计约 30TB。
  • 其他:如配置数据、监控指标,约 1TB。

数据特点

  • 时间序列:日志和行为数据按时间分片(如 logs-2025.04.12)。
  • 高写入:峰值 100K 文档/秒。
  • 查询模式:实时分析(最近 7 天)占 80%,历史查询占 20%。

4. 分片策略

  • 主分片数
    • 每个索引默认 3-5 个主分片,单分片目标大小 20-50GB。
    • 例:每日日志索引(1TB)分配 20 个主分片,单分片约 50GB。
  • 副本数
    • 默认 1 个副本(高可用性),查询密集索引设为 2。
  • 分片分配
    • 热节点:优先分配新索引(node.attr.data: hot)。
    • 冷节点:存储 7 天后数据(node.attr.data: cold)。
    • 均衡策略:cluster.routing.allocation.balance.shard 优化。
  • 总量
    • 主分片:约 2500 个。
    • 副本分片:约 2500 个。
    • 单节点分片:控制在 100-150 个(20GB 堆约 120 个分片)。

分片优化原则

  • 避免过分片(Oversharding):过多分片增加管理开销。
  • 控制单分片大小:过大影响恢复速度,过小降低效率。
  • 动态调整:通过 ILM(索引生命周期管理)自动滚动和删除。

二、xAI 集群架构的实现细节

1. 冷热分离架构

xAI 采用冷热分离优化存储和性能:

  • 热节点
    • 处理实时写入和查询(最近 7 天)。
    • 配置:NVMe SSD,16 核,64GB 内存,2TB 存储。
    • 分片设置:index.priority: 100,优先分配。
  • 冷节点
    • 存储历史数据(7-90 天)。
    • 配置:HDD,8 核,32GB 内存,10TB 存储。
    • 分片设置:index.priority: 0,延迟分配。
  • ILM 驱动
    • 索引在 7 天后迁移到冷节点,30 天后压缩,90 天后删除。

ILM 配置

PUT _ilm/policy/xai_log_policy
{"policy": {"phases": {"hot": {"actions": {"rollover": {"max_size": "50gb","max_age": "7d"},"set_priority": { "priority": 100 }}},"warm": {"min_age": "7d","actions": {"allocate": { "require": { "data": "warm" } },"forcemerge": { "max_num_segments": 1 },"set_priority": { "priority": 50 }}},"cold": {"min_age": "30d","actions": {"allocate": { "require": { "data": "cold" } },"set_priority": { "priority": 0 }}},"delete": {"min_age": "90d","actions": { "delete": {} }}}}
}

应用 ILM

PUT logs-2025.04.12-000001
{"settings": {"index.lifecycle.name": "xai_log_policy","index.lifecycle.rollover_alias": "logs","number_of_shards": 20,"number_of_replicas": 1}
}

2. 分片分配与负载均衡

  • 分配规则
    • 使用 node.attr 控制分片分配。
    • 例:cluster.routing.allocation.require.data: hot 限制新索引。
  • 负载均衡
    • cluster.routing.allocation.balance.shard: 2.0(分片数均衡)。
    • cluster.routing.allocation.balance.index: 0.55(索引分布)。
  • 磁盘水位
    • cluster.routing.allocation.disk.watermark.low: 85%
    • cluster.routing.allocation.disk.watermark.high: 90%
  • 动态调整
    • 新节点加入后,自动触发 _cluster/reroute 重新分配。

示例:限制分片分配

PUT _cluster/settings
{"persistent": {"cluster.routing.allocation.require.data": "hot"}
}

3. 数据摄入与查询优化

  • 摄入管道
    • 使用 Ingest Pipeline 清洗日志(如提取时间戳、过滤无关字段)。
    • 配置:pipeline: xai_log_clean
  • 写入优化
    • 批量写入:每批 10MB,1000 文档。
    • 刷新间隔:index.refresh_interval: 30s
  • 查询优化
    • 优先 filter 查询,减少评分开销。
    • 使用 search_after 替代深翻页。
    • 缓存频繁查询(index.store.preload: ["nvd", "dvd"])。

摄入管道

PUT _ingest/pipeline/xai_log_clean
{"processors": [{"grok": {"field": "message","patterns": ["%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:content}"]}},{"date": {"field": "timestamp","formats": ["ISO8601"]}},{"remove": {"field": "message"}}]
}

4. 索引数据规模管理

  • 单索引大小
    • 日志索引:1TB(20 个主分片,50GB/分片)。
    • 元数据索引:100GB(5 个主分片,20GB/分片)。
  • 压缩
    • index.codec: best_compression 降低存储 20-30%。
  • 段合并
    • 定期 POST logs-2025.04.12/_forcemerge?max_num_segments=1
  • 删除策略
    • ILM 自动删除过期索引,释放空间。

压缩设置

PUT logs-2025.04.12/_settings
{"index": {"codec": "best_compression"}
}

三、Java 实践:实现集群状态监控工具

以下通过 Spring Boot 和 Elasticsearch Java API 实现一个监控 xAI 集群状态的工具,展示节点、分片和索引信息。

1. 环境准备

  • 依赖pom.xml):
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.17.9</version></dependency>
</dependencies>

2. 核心组件设计

  • ClusterInfo:集群状态实体。
  • ClusterMonitor:监控节点、分片和索引。
  • MonitorService:对外接口。
ClusterInfo 类
public class ClusterInfo {private String clusterName;private int nodeCount;private int dataNodeCount;private int shardCount;private long totalDocs;private long totalSizeBytes;public ClusterInfo(String clusterName, int nodeCount, int dataNodeCount, int shardCount, long totalDocs, long totalSizeBytes) {this.clusterName = clusterName;this.nodeCount = nodeCount;this.dataNodeCount = dataNodeCount;this.shardCount = shardCount;this.totalDocs = totalDocs;this.totalSizeBytes = totalSizeBytes;}// Getters and setterspublic String getClusterName() { return clusterName; }public void setClusterName(String clusterName) { this.clusterName = clusterName; }public int getNodeCount() { return nodeCount; }public void setNodeCount(int nodeCount) { this.nodeCount = nodeCount; }public int getDataNodeCount() { return dataNodeCount; }public void setDataNodeCount(int dataNodeCount) { this.dataNodeCount = dataNodeCount; }public int getShardCount() { return shardCount; }public void setShardCount(int shardCount) { this.shardCount = shardCount; }public long getTotalDocs() { return totalDocs; }public void setTotalDocs(long totalDocs) { this.totalDocs = totalDocs; }public long getTotalSizeBytes() { return totalSizeBytes; }public void setTotalSizeBytes(long totalSizeBytes) { this.totalSizeBytes = totalSizeBytes; }
}
ClusterMonitor 类
@Component
public class ClusterMonitor {private final RestHighLevelClient client;public ClusterMonitor() {client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));}public ClusterInfo getClusterStatus() throws IOException {ClusterHealthResponse health = client.cluster().health(new ClusterHealthRequest(), RequestOptions.DEFAULT);GetNodesResponse nodes = client.nodes().info(RequestOptions.DEFAULT);CatIndicesResponse indices = client.cat().indices(new CatIndicesRequest(), RequestOptions.DEFAULT);int dataNodeCount = 0;for (NodeInfoResponse node : nodes.getNodes()) {if (node.getRoles().contains("data")) {dataNodeCount++;}}long totalDocs = 0;long totalSize = 0;int shardCount = 0;for (CatIndicesRecord index : indices.getRecords()) {totalDocs += Long.parseLong(index.getDocsCount());totalSize += Long.parseLong(index.getStoreSize());shardCount += Integer.parseInt(index.getPrimaryShards()) * 2; // 含副本}return new ClusterInfo(health.getClusterName(),nodes.getNodes().size(),dataNodeCount,shardCount,totalDocs,totalSize);}public List<Map<String, Object>> getShardInfo() throws IOException {CatShardsResponse response = client.cat().shards(new CatShardsRequest(), RequestOptions.DEFAULT);List<Map<String, Object>> shards = new ArrayList<>();for (CatShardsRecord shard : response.getRecords()) {Map<String, Object> info = new HashMap<>();info.put("index", shard.getIndex());info.put("shard", shard.getShard());info.put("primaryOrReplica", shard.getPrimaryOrReplica());info.put("node", shard.getNode());info.put("state", shard.getState());info.put("docs", shard.getDocs());info.put("size", shard.getStoreSize());shards.add(info);}return shards;}@PreDestroypublic void close() throws IOException {client.close();}
}
MonitorService 类
@Service
public class MonitorService {private final ClusterMonitor monitor;@Autowiredpublic MonitorService(ClusterMonitor monitor) {this.monitor = monitor;}public ClusterInfo getClusterOverview() throws IOException {return monitor.getClusterStatus();}public List<Map<String, Object>> getShardDetails() throws IOException {return monitor.getShardInfo();}
}

3. 控制器

@RestController
@RequestMapping("/monitor")
public class MonitorController {@Autowiredprivate MonitorService monitorService;@GetMapping("/cluster")public ClusterInfo getClusterStatus() throws IOException {return monitorService.getClusterOverview();}@GetMapping("/shards")public List<Map<String, Object>> getShards() throws IOException {return monitorService.getShardDetails();}
}

4. 主应用类

@SpringBootApplication
public class ClusterMonitorApplication {public static void main(String[] args) {SpringApplication.run(ClusterMonitorApplication.class, args);}
}

5. 测试

前置配置
  • 集群配置elasticsearch.yml 示例):
    # 主节点
    node.name: master1
    node.roles: [master]
    node.attr.data: none
    discovery.seed_hosts: ["master1", "master2", "master3"]
    cluster.initial_master_nodes: ["master1", "master2", "master3"]# 数据节点(热)
    node.name: data-hot1
    node.roles: [data]
    node.attr.data: hot
    xpack.monitoring.enabled: true
    
测试 1:集群概览
  • 请求
    • GET http://localhost:8080/monitor/cluster
  • 响应
    {"clusterName": "xai-prod","nodeCount": 25,"dataNodeCount": 15,"shardCount": 5000,"totalDocs": 1000000000,"totalSizeBytes": 50000000000000
    }
    
  • 分析:确认集群规模和数据量。
测试 2:分片详情
  • 请求
    • GET http://localhost:8080/monitor/shards
  • 响应
    [{"index": "logs-2025.04.12","shard": "0","primaryOrReplica": "p","node": "data-hot1","state": "STARTED","docs": "5000000","size": "50gb"},...
    ]
    
  • 分析:验证分片分配和状态。
测试 3:性能测试
  • 代码
    public class ClusterPerformanceTest {public static void main(String[] args) throws IOException {ClusterMonitor monitor = new ClusterMonitor();long start = System.currentTimeMillis();ClusterInfo info = monitor.getClusterStatus();long end = System.currentTimeMillis();System.out.println("Cluster status fetch time: " + (end - start) + "ms");System.out.println("Nodes: " + info.getNodeCount() + ", Shards: " + info.getShardCount());start = System.currentTimeMillis();List<Map<String, Object>> shards = monitor.getShardInfo();end = System.currentTimeMillis();System.out.println("Shard info fetch time: " + (end - start) + "ms");System.out.println("Shard count: " + shards.size());monitor.close();}
    }
    
  • 结果
    Cluster status fetch time: 120ms
    Nodes: 25, Shards: 5000
    Shard info fetch time: 200ms
    Shard count: 5000
    
  • 分析:监控响应快速,适合实时管理。
测试 4:扩展测试
  • 操作
    • 添加 2 个数据节点。
    • 检查:GET _cat/shards?v
  • 结果:分片自动重新分配,节点负载均衡。
  • 分析:集群扩展高效,适应数据增长。

四、xAI 集群的优化实践

1. 分片与索引优化

  • 动态分片
    • 新索引根据数据量调整主分片数(PUT logs-2025.04.13/_settings)。
    • 例:预测每日 2TB 数据,增至 40 个主分片。
  • 避免过分片
    • 单节点分片数控制在 20 * GB 堆(30GB 堆约 600 个分片)。
  • 段管理
    • 定期合并(forcemerge)减少段数。
    • 配置:index.merge.policy.max_merged_segment: 5gb

2. 性能调优

  • 写入优化
    • 异步批量写入,线程池大小 queue_size: 200
    • 增大 index.translog.flush_threshold_size: 1gb
  • 查询优化
    • 使用 index.routing.partition.size 优化大索引查询。
    • 缓存策略:index.requests.cache.enable: true
  • JVM 调优
    • 堆大小:数据节点 30GB,主节点 8GB。
    • GC 配置:-XX:+UseG1GC -XX:MaxGCPauseMillis=200

JVM 配置

# jvm.options
-Xms30g
-Xmx30g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200

3. 监控与报警

  • Kibana 监控
    • 跟踪节点 CPU、堆使用率和分片状态。
    • 配置:xpack.monitoring.collection.enabled: true
  • 慢查询日志
    PUT logs-*/_settings
    {"index.search.slowlog.threshold.query.warn": "5s"
    }
    
  • 报警
    • 磁盘使用率 > 85% 触发警告。
    • 分片未分配(unassigned_shards)触发告警。

4. 生产实践

  • 故障演练
    • 定期模拟数据节点故障,验证分片恢复(< 5 分钟)。
  • 备份策略
    • 使用 Snapshot API 备份冷数据到 S3。
    • 配置:PUT _snapshot/xai_backup
  • 版本升级
    • 滚动升级(7.17 到 8.x),零停机。
    • 测试:单节点升级后验证查询一致性。

快照配置

PUT _snapshot/xai_backup
{"type": "s3","settings": {"bucket": "xai-es-backup","region": "us-east-1"}
}

五、总结

xAI 的 Elasticsearch 集群通过冷热分离、多角色节点和 ILM 实现了高可用、高性能和可扩展性。索引数据规模约 50TB,分片总数 5000 个,单分片控制在 20-50GB,满足日志、元数据和行为分析需求。本文结合 Java 实现了一个监控工具,验证了集群状态的实时性和稳定性。

相关文章:

xAI Elasticsearch 集群架构解析:索引数据规模与分片优化实践

Elasticsearch&#xff08;ES&#xff09;作为分布式搜索和分析引擎&#xff0c;是 xAI 构建高性能数据处理系统的基石。xAI 的业务场景&#xff0c;如实时日志分析、模型训练数据检索和用户行为分析&#xff0c;要求 Elasticsearch 集群兼顾高吞吐写入、低延迟查询和动态扩展能…...

[c语言日寄]时间复杂度

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…...

快速幂(蓝桥杯)

1. 递归实现 递归方法通过将问题分解为更小的子问题来实现。具体步骤如下&#xff1a; 如果指数 b 为 0&#xff0c;返回 1。 如果 b 是偶数&#xff0c;则递归计算 (a^2)b/2。 如果 b 是奇数&#xff0c;则递归计算 a⋅(a^2)(b−1)/2。 伪代码&#xff1a; function fas…...

[Python基础速成]2-模块与包与OOP

上篇➡️[Python基础速成]1-Python规范与核心语法 目录 Python模块创建模块与导入属性__name__dir()函数标准模块 Python包类类的专有方法 对象继承多态 Python模块 Python 中的模块&#xff08;Module&#xff09;是一个包含 Python 定义和语句的文件&#xff0c;文件名就是模…...

Spring AOP 学习笔记 之 常用注解

0 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId><version>3.4.2</version></dependency> 要在springboot中启用AOP&#xff0c;需要引入spring-boot-…...

JVM——运行时数据区

目录 Class装载到JVM的过程 装载&#xff08;load&#xff09;——查找和导入class文件 正文------------------- Run-time Data Areas 运行时数据区 Method Area 方法区 Heap 堆 Java Virtual Machine Stacks&#xff08;Java虚拟机栈&#xff09; The PC Register 程…...

Conda 入门指令教程

Conda 入门指令教程 Conda 是一个强大的包和环境管理工具&#xff0c;广泛应用于数据科学和机器学习项目中。本文将介绍 Conda 的常用指令&#xff0c;帮助你快速上手。 1. Conda 基础操作 查看 Conda 版本 conda --version显示当前安装的 Conda 版本。 更新 Conda conda…...

基于STM32、HAL库的MAX14830总线转UART驱动程序设计

一、简介: MAX14830是一款四通道UART扩展器,通过SPI或I2C接口与微控制器通信。主要特性包括: 4个独立的全双工UART通道 可编程波特率(最高达12Mbps) 每个通道有128字节的发送和接收FIFO 支持硬件和软件流控制 可配置的GPIO引脚 工作电压:1.7V至5.5V 低功耗模式 二、硬件…...

x-cmd install | jellex - 用 Python 语法在终端里玩转 JSON 数据!

目录 核心功能与特点安装优势亮点适用场景 还在为命令行下处理 JSON 数据烦恼吗&#xff1f;jellex 来了&#xff01;它是一款基于终端的交互式 JSON 和 JSON Lines 数据处理工具&#xff0c;让你用熟悉的 Python 语法&#xff0c;轻松过滤、转换和探索 JSON 数据。 核心功能与…...

2025天梯赛 L2专项训练

L2-049 鱼与熊掌 - 团体程序设计天梯赛-练习集 思路就是模拟&#xff0c;正常写就完事 #include<bits/stdc.h> using namespace std; int main() {int a, b;cin >> a >> b;vector<vector<int>>arr(a, vector<int>(0));for (int i 0; i &…...

214、【数组】下一个排列(Python)

题目描述 原题链接&#xff1a;31. 下一个排列 思路 从后往前&#xff0c;找到第一个小于右侧集合的数&#xff0c;从右侧集合中找到一个比该数大的最小的数替换上去。 然后&#xff0c;将右侧集合从小到排列&#xff0c;就为当前排列中&#xff0c;下一个排列的数。 代码实…...

Why does Java‘s hashCode() in String use 31 as a multiplier?

HashCode 为什么使用 31 作为乘数&#xff1f; 1. 固定乘积 31 在这用到了2. 来自 stackoverflow 的回答3. Hash 值碰撞概率统计3.1 读取单词字典表3.2 Hash 计算函数3.3 Hash 碰撞概率计算封装碰撞统计信息的类3.4 针对一组乘数&#xff0c;分别计算碰撞率3.5 碰撞结果可视化3…...

如何将一个8s的接口优化到500ms以下

最近换了个工作&#xff0c;刚入职就接了个活--优化公司自营app的接口性能&#xff0c;提升用户体验。 刚开始还以为是1s优化到500ms这种&#xff0c;或者500ms优化到200ms的接口&#xff0c;感觉还挺有挑战的。下好app体验了一下。好家伙&#xff0c;那个慢已经超过了我的忍耐…...

如何保证本地缓存和redis的一致性

1. Cache Aside Pattern&#xff08;旁路缓存模式&#xff09;​​ ​核心思想​&#xff1a;应用代码直接管理缓存与数据的同步&#xff0c;分为读写两个流程&#xff1a; ​读取数据​&#xff1a; 先查本地缓存&#xff08;如 Guava Cache&#xff09;。若本地未命中&…...

30天学Java第十天——反射机制

反射机制 反射机制是 Java 语言中的一个重要特性&#xff0c;它允许程序在运行时动态地获取类的信息&#xff08;如类的属性、方法和构造器等&#xff09;&#xff0c;并且可以操作这些信息。 反射机制在某些情况下非常有用&#xff0c;例如开发框架、库&#xff0c;或者需要进…...

Nodejs Express框架

参考&#xff1a;Node.js Express 框架 | 菜鸟教程 第一个 Express 框架实例 接下来我们使用 Express 框架来输出 "Hello World"。 以下实例中我们引入了 express 模块&#xff0c;并在客户端发起请求后&#xff0c;响应 "Hello World" 字符串。 创建 e…...

视频设备轨迹回放平台EasyCVR打造货运汽车安全互联网视频监控与管理方案

一、背景介绍 随着互联网发展&#xff0c;货运中介平台大量涌现&#xff0c;行业纠纷也随之增多。尽管当前平台APP具备录音和定位功能&#xff0c;但货物交易流程的全方位监控仍无法实现。主流跟踪定位服务大部分聚焦货物轨迹与车辆定位&#xff0c;尚未实现货物全程可视化监控…...

玩转Docker | 使用Docker部署Docmost文档管理系统

玩转Docker | 使用Docker部署Docmost文档管理系统 前言一、Docmost介绍Docmost 简介Docmost 特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署Docmost服务下载镜像编辑部署文件创建容器检查容器状态检查服务端口安全设置四、访问Docmost服务访问Docmos…...

docker方式项目部署(安装容器组件+配置文件导入Nacos+dockerCompose文件创建管理多个容器+私有镜像仓库Harbor)

基于docker的部署 服务器主机ip 192.168.6.131 安装组件 安装redis docker pull redis:7.0.10#在宿主机上/var/lib/docker/volumes/redis-config/_data/目录下创建一个redis配置文件 vim redis.conf#内容如下 appendonly yes #开启持久化 port 6379 #requirepass 1234 #密码…...

基于OpenCV与PyTorch的智能相册分类器全栈实现教程

引言&#xff1a;为什么需要智能相册分类器&#xff1f; 在数字影像爆炸的时代&#xff0c;每个人的相册都存储着数千张未整理的照片。手动分类不仅耗时&#xff0c;还容易遗漏重要瞬间。本文将手把手教你构建一个基于深度学习的智能相册分类系统&#xff0c;实现&#xff1a;…...

C++中string库常用函数超详细解析与深度实践

目录 一、引言 二、基础准备&#xff1a;头文件与命名空间 三、string对象的创建与初始化(基础&#xff09; 3.1 直接初始化 3.2 动态初始化&#xff08;空字符串&#xff09; 3.3 基于字符数组初始化 3.4 重复字符初始化 四、核心函数详解 4.1 字符串长度相关 4.1.1 …...

数据结构(3)

实验步骤&#xff1a; 任务&#xff1a;要求使用自定义函数来实现 输入一段文本&#xff0c;统计每个字符出现的次数&#xff0c;按照字符出现次数从多到少&#xff0c;依次输出&#xff0c;格式如下&#xff1a; 字符1-个数 字符2-个数 ...... 解题思路&#xff1a; 构建结构体…...

【C++教程】使用printf语句实现进制转换

在C语言中&#xff0c;printf 函数可以直接实现部分进制转换功能&#xff0c;通过格式说明符&#xff08;format specifier&#xff09;快速输出不同进制的数值。以下是详细使用方法及示例代码&#xff1a; 一、printf 原生支持的进制转换 1. 十进制、八进制、十六进制转换 #…...

el-dialog设置append-to不生效;el-dialog设置挂载层级

文章目录 一、场景二、注意点1. append-to-body何时为true2.设置层级&#xff0c;遮罩层大小不生效3.相关代码 三、ElMessageBox遮罩层 效果&#xff1a; 一、场景 正常情况下&#xff0c;el-dialog的弹框是挂载在body下的&#xff0c;导致我们会有修改样式或者修改弹框的遮罩…...

互联网软件开发自动化平台 的多维度对比分析,涵盖架构、功能、适用场景、成本等关键指标

以下是关于 互联网软件开发自动化平台 的详细解析&#xff0c;涵盖其核心概念、主流平台的功能、架构设计、适用场景及对比分析&#xff1a; 一、自动化平台的定义与核心目标 自动化平台&#xff08;如CI/CD平台&#xff09;是用于 持续集成&#xff08;CI&#xff09; 和 持续…...

UE5 制作方块边缘渐变边框效果

该效果基于之前做的&#xff08;https://blog.csdn.net/grayrail/article/details/144546427&#xff09;进行修改得到&#xff0c;思路也很简单&#xff1a; 1.打开实时预览 1.为了制作时每个细节调整方便&#xff0c;勾选Live Update中的三个选项&#xff0c;开启实时预览。…...

深入探究 GRU 模型:梯度爆炸问题剖析

在深度学习领域&#xff0c;循环神经网络&#xff08;RNN&#xff09;及其变体在处理序列数据时展现出了强大的威力。其中&#xff0c;门控循环单元&#xff08;GRU&#xff09;作为 RNN 的一种进阶架构&#xff0c;备受关注。今天&#xff0c;咱们就来深入聊聊 GRU 模型&#…...

生成对抗网络(GAN)原理详解

生成对抗网络&#xff08;GAN&#xff09;原理详解 1. 背景 生成对抗网络&#xff08;Generative Adversarial Network, GAN&#xff09;由 Ian Goodfellow 等人于 2014 年提出&#xff0c;是一种通过对抗训练生成高质量数据的框架。其核心思想是让两个神经网络&#xff08;生…...

CFD中的动量方程非守恒形式详解

在计算流体力学&#xff08;CFD&#xff09;中&#xff0c;动量方程可以写成守恒形式和非守恒形式&#xff0c;两者在数学上等价&#xff0c;但推导方式和应用场景不同。以下是对非守恒形式的详细解释&#xff1a; 1. 动量方程的守恒形式 首先回顾守恒形式的动量方程&#xff…...

AIoT 智变浪潮演讲实录 | 刘浩然:让硬件会思考:边缘大模型网关助力硬件智能革新

4 月 2 日&#xff0c;由火山引擎与英特尔联合主办的 AIoT “智变浪潮”技术沙龙在深圳成功举行&#xff0c;活动聚焦 AI 硬件产业的技术落地与生态协同&#xff0c;吸引了芯片厂商、技术方案商、品牌方及投资机构代表等 700 多位嘉宾参会。 会上&#xff0c;火山引擎边缘智能高…...

4.B-树

一、常见的查找方式 顺序查找 O(N) 二分查找 O(logN)(要求有序和随机访问) 二叉搜索树 O(N) 平衡二叉搜索树(AVL树和红黑树) O(logN) 哈希 O(1) 考虑效率和要求而言,正常选用 平衡二叉搜索树 和 哈希 作为查找方式。 但这两种结构适合用于数据量相对不是很大,能够一次性…...

怎么看英文论文 pdf沉浸式翻译

https://arxiv.org/pdf/2105.09492 Immersive Translate Xournal打开...

计算机三级第一章:信息安全保障概述(以时间节点推进的总结)

淡蓝色为必背内容 第一阶段:电讯技术的发明19世纪30年代:电报电话的发明 1835年:莫尔斯(Morse)发明了电报 1837年:莫尔斯电磁式有线电报问世 1878年:人工电话交换局出现 1886年:马可尼发明了无线电报机 1876年:贝尔(Bell)发明了电话机 1892年,史瑞桥自动交换…...

车载软件架构 ---单个ECU的AUTOSAR开发流程

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...

【场景应用7】在TPU上使用Flax/JAX对Transformers模型进行语言模型预训练

在本笔记本中,我们将展示如何使用Flax在TPU上预训练一个🤗 Transformers模型。 这里将使用GPT2的因果语言建模目标进行预训练。 正如在这个基准测试中所看到的,使用Flax/JAX在GPU/TPU上的训练通常比使用PyTorch在GPU/TPU上的训练要快得多,而且也可以显著降低成本。 Fla…...

C++运算符重载全面总结

C运算符重载全面总结 运算符重载是C中一项强大的特性&#xff0c;它允许程序员为自定义类型定义运算符的行为。以下是关于C运算符重载的详细总结&#xff1a; 一、基本概念 1. 什么是运算符重载 运算符重载是指为自定义类型&#xff08;类或结构体&#xff09;重新定义或重…...

PTA | 实验室使用排期

目录 题目&#xff1a; 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 样例解释&#xff1a; 代码&#xff1a; 无注释版&#xff1a; 有注释版&#xff1a; 题目&#xff1a; 受新冠疫情影响&#xff0c;当前大家的活动都…...

3.7 字符串基础

字符串 &#xff08;str&#xff09;&#xff1a;和列表用法基本一致 1.字符串的创建 -str转换(字符串&#xff0c;可用于将其他字符类型转换为字符串) -单引号 双引号 三引号 2.索引 3.字符串的切片 4.字符串的遍历 5.字符串的格式化 6.字符串的运算符 7.字符串的函数 #…...

《 C++ 点滴漫谈: 三十三 》当函数成为参数:解密 C++ 回调函数的全部姿势

一、前言 在现代软件开发中&#xff0c;“解耦” 与 “可扩展性” 已成为衡量一个系统架构优劣的重要标准。而在众多实现解耦机制的技术手段中&#xff0c;“回调函数” 无疑是一种高效且广泛使用的模式。你是否曾经在编写排序算法时&#xff0c;希望允许用户自定义排序规则&a…...

16bit转8bit的常见方法(图像归一化)

文章目录 16-bit转8-bit的常用方法一、数据类型转换&#xff1a;image.astype(np.uint8) —— 若数值 x 超出 0-255 范围&#xff0c;则取模运算。如&#xff1a;x 600 % 256 88二、截断函数&#xff1a;np.clip().astype(np.uint8) —— 若数值 x 超出 0-255 范围&#xff0…...

消息中间件kafka,rabbitMQ

在分布式系统中,消息中间件是实现不同组件之间异步通信的关键技术。Kafka 和 RabbitMQ 是两个非常流行的消息中间件系统,它们各自有着不同的特点和应用场景。下面将分别介绍 Kafka 和 RabbitMQ,并讨论它们在消息队列中的使用。 一、Kafka (Apache Kafka) 主要特点: 高吞吐…...

C语言编译预处理3

条件编译&#xff1a;是对源程序的一部分指定编译条件&#xff0c;满足条件进行编译否则不编译。 形式1 #indef 标识符 程序段1 #else 程序段2 #endif 标识符已经被定义用#ifdef #include <stdio.h>// 可以通过注释或取消注释下面这行来控制是否定义 DEBUG 宏 // …...

数据结构·树

树的特点 最小连通图 无环 有且只有 n − 1 n-1 n−1 条边 树的建立方式 顺序存储 只适用于满n叉树&#xff0c;完全n叉树 1<<n 表示结点 2 n 2^n 2nP4715 【深基16.例1】淘汰赛 void solve() {cin >> n;for (int i 0; i<(1<<n); i) {cin >&g…...

队列的各种操作实现(数据结构C语言多文件编写)

1.先创建queue.h声明文件(Linux命令&#xff1a;touch queue.h)。编写函数声明如下(打开文件 Linux 操作命令&#xff1a;vim queue.h): //头文件 #ifndef __QUEUE_H__ #define __QUEUE_H__ //队列 typedef struct queue{int* arr;int in;int out;int cap;int size; }queue_t;…...

48V/2kW储能电源纯正弦波逆变器详细设计方案-可量产

48V/2kW储能电源纯正弦波逆变器详细设计方案 1.后级驱动电路图 2.前级驱动电路图 3.功率表电路原理图 4.功率板BOM: 5.后级驱动BOM 6.前级驱动BOM...

[redis进阶二]分布式系统之主从复制结构(2)

目录 一 redis的拓扑结构 (1)什么是拓扑 (2)⼀主⼀从结构 (3)⼀主多从结构 (4)树形主从结构 (5)三种拓扑结构的优缺点,以及适用场景 二 redis的复制原理 (1)复制过程 (2)数据同步psync replicationid/replid (复制id)(标注同步的数据来自哪里:数据来源) offset (偏移…...

Playwright多语言生态:跨Python_Java_.NET的统一采集方案

一、问题背景&#xff1a;爬虫多语言割裂的旧时代 在大规模数据采集中&#xff0c;尤其是学术数据库如 Scopus&#xff0c;开发者常遇到两个经典问题&#xff1a; 技术语言割裂&#xff1a;Python开发人员使用Selenium、requests-html等库&#xff1b;Java阵营使用Jsoup或Htm…...

day30 第八章 贪心算法 part04

452. 用最少数量的箭引爆气球 先排序&#xff0c;再算重叠区间 class Solution:def findMinArrowShots(self, points: List[List[int]]) -> int:if len(points)0:return 0points.sort(keylambda x:x[0])result 1for i in range(1, len(points)):if points[i][0] > point…...

java操作redis库,开箱即用

application.yml spring:application:name: demo#Redis相关配置redis:data:# 地址host: localhost# 端口&#xff0c;默认为6379port: 6379# 数据库索引database: 0# 密码password:# 连接超时时间timeout: 10slettuce:pool:# 连接池中的最小空闲连接min-idle: 0# 连接池中的最…...

clickhouse中的窗口函数

窗口函数 边界核心参数 窗口边界通过 ROWS、RANGE 或 GROUPS 模式定义,语法为: ROWS BETWEEN AND 基于 ​物理行位置 定义窗口,与排序键的实际值无关,适用于精确控制窗口行数 – 或 RANGE BETWEEN AND 基于 ​排序键的数值范围 定义窗口,适用于时间序列或连续数值的场景(…...