doris集群物理部署保姆级教程
doris物理安装
1、安装要求
Linux 操作系统版本需求
查看CentOs版本(>=7.1)
cat /etc/redhat-release
1)设置系统最大打开文件句柄数
vi /etc/security/limits.conf
- soft nofile 65536
- hard nofile 65536
echo ‘’’
- soft nofile 655360
- hard nofile 655360
‘’’ >> /etc/security/limits.conf
2)时钟同步(参考指南)
Doris 的元数据要求时间精度要小于5000ms,所以所有集群所有机器要进行时钟同步,避免因为时钟问题引发的元数据不一致导致服务出现异常。
vi /etc/chrony.conf
3)关闭交换分区(swap)
Linux交换分区会给Doris带来很严重的性能问题,需要在安装之前禁用交换分区。
使用不重启的方式,禁用swap,立即生效
sudo swap -a
sudo free -m
4)Liunx文件系统
这里我们推荐使用ext4文件系统,在安装操作系统的时候,请选择ext4文件系统。
查看文件系统 xfs(Cent OS之后)
df -hT
2. 软件需求
查看GCC版本(>=4.8.2)
gcc -v
安装并查看JAVA版本(>=1.8)
rpm -qa | grep java
yum list java*
yum install java-1.8.0-openjdk.x86_64 -y
java - version
集群部署
因为我们采用集群部署,所以每台服务器都需要上传解压。
#################################################################
3、FE部署
1)拷贝 FE 部署文件到指定节点
解压压缩包
cd /data/
tar -xvf apache-doris-fe-2.0.0-alpha1-bin-x86_64.tar.xz
mv apache-doris-fe-2.0.0-alpha1-bin-x86_64 fe
2)配置FE
建元数据路径
mkdir -p /data/doris-meta
配置 FE-Config
vi fe/conf/fe.conf
取消 priority_networks 的注释,修改参数
例如当前节点的 IP 地址为 10.10.2.21,则需要更改为 10.10.2.0/24 填入
这里需要填入的是 IP 子网网段地址,并非 IP 地址
priority_networks = 10.10.2.0/24
#配置文件中指定元数据路径:
meta_dir=/data/doris-meta
保存退出
3)启动 FE
在 FE 安装目录下执行下面的命令,来完成 FE 的启动。
./bin/start_fe.sh --daemon
查看 FE 运行状态–等1 min后试:
curl http://127.0.0.1:8030/api/bootstrap
这里 IP 和 端口分别是 FE 的 IP 和 http_port(默认8030),如果是在 FE 节点执行,直接运行上面的命令即可。如果返回结果中带有 “msg”:“success” 字样,则说明启动成功。
4)连接 FE
通过下载免安装的 MySQL 客户端(mysql-client)来连接 Doris FE。
解压刚才下载的 MySQL 客户端,在 bin/ 目录下可以找到 mysql 命令行工具。然后执行下面的命令连接 Doris。
mysql -uroot -P9030 -h127.0.0.1
查看 FE 运行状态(如果 IsMaster、Join 和 Alive 三列均为true,则表示节点正常)
SHOW FRONTENDS\G;
5)停止FE
在 FE 安装目录下执行下面的命令,来完成 FE 的停止。
./bin/stop_fe.sh(doris的fe,be节点没有启动顺序依赖)
#################################################################
4、BE部署
1)拷贝 BE 部署文件到指定节点
解压压缩包
cd /data/
tar -xvf apache-doris-be-2.0.0-alpha1-bin-x86_64.tar.xz
mv apache-doris-be-2.0.0-alpha1-bin-x86_64 be
2)配置BE
#创建data目录
mkdir -p /data/dorisdata
配置 BE-Config
vi be/conf/be.conf
取消 priority_networks 的注释,修改参数
例如当前节点的 IP 地址为 10.10.2.21,则需要更改为 10.10.2.0/24 填入
这里需要填入的是 IP 子网网段地址,并非 IP 地址
priority_networks = 10.10.2.0/24
#配置文件中指定数据存放路径:
storage_root_path=/data/dorisdata
#更快的导入速度,默认为2
flush_thread_num_per_store=5
#修改 BE 的配置文件 be.conf 添加以下配置项,重启BE,以获得更好的查询性能
enable_storage_vectorization=true
enable_low_cardinality_optimize=true
保存退出
3)启动 BE
在 BE 安装目录下执行下面的命令,来完成 BE 的启动。
./bin/start_be.sh --daemon
查看 BE 运行状态
#cat ./log/be.INFO
I1025 20:59:59.367655 26241 data_dir.cpp:350] start to load tablets from /data/dorisapp/newinstall/dorisdata
I1025 20:59:59.367910 26241 data_dir.cpp:343] successfully check incompatible old format meta /data/dorisapp/newinstall/dorisdata
I1025 20:59:59.367916 26241 data_dir.cpp:361] begin loading rowset from meta
启动报错
[root@xlucas4 apache-doris-be-1.2.3-bin-x86_64-noavx2]# bin/start_be.sh --daemon
Please set vm.max_map_count to be 2000000 under root using ‘sysctl -w vm.max_map_count=2000000’.
解决方案:sysctl -w vm.max_map_count=2000000
再次启动报错
[root@xlucas2 apache-doris-be-1.2.3-bin-x86_64-noavx2]# bin/start_be.sh
Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/doris/udf/JniUtil
Caused by: java.lang.ClassNotFoundException: org.apache.doris.udf.JniUtil
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
WARNING: Logging before InitGoogleLogging() is written to STDERR
W0416 01:53:45.238514 2901 doris_main.cpp:382] Failed to initialize JNI: [INTERNAL_ERROR]Failed to find JniUtil class.
原因:安装Java UDF 函数因为从 1.2 版本开始支持 Java UDF 函数,需要从官网下载 Java UDF 函数的 JAR 包放到 BE 的 lib 目录下,否则可能会启动失败。在官网下载依赖的jar包。下载完成后拷贝到BE的lib目录下即可
将包scp到BE节点:scp ./java-udf-jar-with-dependencies.jar root@192.168.18.134:/root/doris/apache-doris-be-1.2.3-bin-x86_64-noavx2/lib
注意:如果不是安装doris-1.2.0以后的版本可以不用下载该jar包
由于端口占用修改be.conf: webserver_port = 8049 curl http://127.0.0.1:8049/api/health
curl http://127.0.0.1:8040/api/health
如果返回: {“status”: “OK”,“msg”: “To Be Added”} 则表示启动成功,其余情况,则可能存在问题。
4)停止BE
在 BE 安装目录下执行下面的命令,来完成 BE 的停止。
./bin/stop_be.sh
#################################################################
5、组建集群
(集群规模两台FE节点,一个follower,二个observer,三台BE节点,一台broker节点)
默认一个集群,只能有一个 Leader,可以有多个 Follower 和 Observer。
其中 Leader 和 Follower 组成一个 Paxos 选择组
如果 Leader 宕机,则剩下的 Follower 会自动选出新的 Leader,保证写入高可用。
Observer 同步 Leader 的数据,但是不参加选举。
如果只部署一个 FE,则 FE 默认就是 Leader
FE 节点的数量:
FE 角色分为 Follower 和 Observer,(Leader 为 Follower 组中选举出来的一种角色,以下统称 Follower)。
FE 节点数据至少为1(1 个 Follower)。当部署 1 个 Follower 和 1 个 Observer 时,可以实现读高可用。当部署 3 个 Follower 时,可以实现读写高可用(HA)。
Follower 的数量必须为奇数,Observer 数量随意。
根据以往经验,当集群可用性要求很高时(比如提供在线业务),可以部署 3 个 Follower 和 1-3 个 Observer。如果是离线业务,建议部署 1 个 Follower 和 1-3 个 Observer
0、配置环境变量
vim /etc/profile
#添加如下内容
echo ‘’’
export DORIS_HOME=/data/dorisapp
export PATH= P A T H : PATH: PATH:DORIS_HOME/be/apache-doris-be-2.0.0-alpha1-bin-x86_64/bin:$DORIS_HOME/fe/apache-doris-fe-2.0.0-alpha1-bin-x86_64/bin
‘’’ >> /etc/profile
source /etc/profile
1、启动FE、BE
./bin/start_fe.sh --daemon
(第一台fe什么都不需要加,后边的fe启动命令为:start_fe.sh --helper leader_fe_host:edit_log_port --daemon)
10.@@@.9 start_fe.sh --daemon (leader)
2、组群配置
在第一台启动的fe节点执行(10.@@@.9为LEADER):
mysql -uroot -P9030 -h10.@@@.9 (第一次进去不用填密码,默认密码为空,修改密码)
#修改密码
SET PASSWORD FOR ‘root’ = PASSWORD(‘123456’);
添加一个FE(FOLLOWER)节点
#添加FOLLOWER
ALTER SYSTEM ADD FOLLOWER “10.@@@.12:9010”;
#删除FOLLOWER
ALTER SYSTEM DROP FOLLOWER “10.@@@.12:9010”
添加二个FE(OBSERVER)节点
#添加OBSERVER
ALTER SYSTEM ADD OBSERVER “10.@@@.10:9010”;
ALTER SYSTEM ADD OBSERVER “10.@@@.11:9010”;
#删除OBSERVER
ALTER SYSTEM DROP OBSERVER “10.@@@.12:9010”;
添加三个BE节点
#添加be
ALTER SYSTEM ADD BACKEND “10.@@@.9:9050”;
ALTER SYSTEM ADD BACKEND “10.@@@.10:9050”;
ALTER SYSTEM ADD BACKEND “10.@@@.11:9050”;
#删除be
ALTER SYSTEM DROP BACKEND “10.@@@.12:9050”;
添加一个broker节点 (暂时没用到)
#添加broker
ALTER SYSTEM ADD BROKER broker_name “0.0.0.0:0000”;
#删除broker
ALTER SYSTEM DROP BROKER broker_name “0.0.0.0:0000”;
3、启动其余服务
10.@@@.10 start_fe.sh --helper 10.@@@.9:9010 --daemon (leader_fe_host:edit_log_port --daemon)
10.@@@.11 start_fe.sh --helper 10.@@@.9:9010 --daemon
start_be.sh --daemon (3台)
4、查看运行状态
访问doris 页面:http://10.@@@.9:8030/home
在第一台启动的fe节点执行(10.@@@.9为LEADER):
mysql -uroot -P9030 -h10.@@@.9
#查看fe
SHOW PROC ‘/frontends’;
SHOW PROC ‘/frontends’\G;
#检查fe
http://10.@@@.9:8030/api/bootstrap
curl http://127.0.0.1:8030/api/bootstrap
#查看be
SHOW PROC ‘/backends’;
SHOW PROC ‘/backends’\G;
#检查be
http://10.@@@.9:8040/api/health
http://10.@@@.10:8040/api/health
http://10.@@@.11:8040/api/health
curl http://127.0.0.1:8040/api/health
#查看broker(暂时没用到)
SHOW PROC “/brokers”;
SHOW PROC ‘/brokers’\G;
6、doris使用
验证:
两个表union,minus一个,找差异
#mysql-client连接doris
mysql -uroot -P9030 -h10.@@@.9
#修改密码
SET PASSWORD FOR ‘root’ = PASSWORD(‘123456’);
#使用密码登陆
mysql -uroot -P9030 -h10.@@@.9 -p123456
#创建一个普通用户
CREATE USER ‘dorisuser’ IDENTIFIED BY ‘123123’;
#数据库授权给用户
CREATE DATABASE dorisdb;
GRANT ALL ON dorisdb to “dorisuser”;
#使用dorisuser用户进行登录并查看数据库
mysql -udorisuser -P9030 -h10.@@@.9 -p123123
MySQL> SHOW DATABASES;
select * from (select 1 from tables union select 2 from tables) as ttt limit 1;
select * from (select TABLE_NAME from columns union all select TABLE_NAME from tables) as untable limit 10;
set enable_profile = true;
set exec_mem_limit = 8G;
set compaction_task_num_per_disk = 4;
set streaming_load_json_max_mb = 150;
set max_segment_num_per_rowset = 500;
set enable_sql_cache = true;
set enable_partition_cache = true;
set enable_pipeline_engine = true;
set parallel_fragment_exec_instance_num = 16;
调优:
############################################FE############################################
stream_load_default_timeout_second: Default stream load timeout,insert into [streaming] 失败时可以设置
sys_log_verbose_modules: 打印debug日志的模块 sys_log_verbose_module=org.apache.doris 代表全部
############################################BE############################################
mem_limit:be最多使用部署机器的内存百分比,默认80%
sys_log_verbose_module: 打印debug日志的模块 sys_log_verbose_module=*代表全部
doris_max_scan_key_num:doris会将可枚举的类型拆分查询,比如id=5 and date>=‘2019-01-01’ and date<='2019-01-31’的查询,doris会将其拆分成31个小查询分别查询[5,2019-01-01]…[5,2019-01-31],但是会有一个阈值(doris_max_scan_key_num),超过这个阈值后不再拆分,可根据业务调整
############################################variable############################################
exec_mem_limit:单条查询最多使用的be内存
query_timeout:查询超时,单位秒
time_zone:时区
1、增大内存
内存不够时, 查询可能会出现‘Memory limit exceeded’, 这是因为doris对每个用户默认设置内存限制为2g
SHOW VARIABLES LIKE “%mem_limit%”;
exec_mem_limit 的单位是 byte,可以通过 SET 命令改变 exec_mem_limit 的值。如改为 8GB。
SET exec_mem_limit = 8589934592;
上述设置仅仅在当前session有效, 如果想永久有效, 需要添加 global 参数
SET GLOBAL exec_mem_limit = 8589934592;
2、修改超时时间
doris默认最长查询时间为300s, 如果仍然未完成, 会被cancel掉
SHOW VARIABLES LIKE “%query_timeout%”;
可以修改为60s
SET query_timeout = 60;
如果需要全局生效需要添加参数 global
set global query_timeout = 60;
3、Broadcast/Shuffle Join
doris在join操作的时候时候, 默认使用broadcast的方式进行join, 即将小表通过广播的方式广播到大表所在的节点, 形成内存hash, 然后流式读出大表数据进行hashjoin
但如果小表的数据量也很大的时候, 就会造成内存溢出, 此时需要通过shuffle join的方式进行, 也被称为partition join. 即将大表小表都按照join的key进行hash, 然后进行分布式join
使用 Broadcast Join(默认)
select sum(table1.pv) from table1 join table2 where table1.siteid = 12;
显示指定braodcast
select sum(table1.pv) from table1 join [broadcast] table2 where table1.siteid = 12;
使用suffle join
select sum(table1.pv) from table1 join [shuffle] table2 where table1.siteid = 12;
9 10 11 划个300G存储,存介质
主机信息:
10.@@@.18
10.@@@.19
10.@@@.20
10.@@@.21
ocdp/Ocdp@1uC2016
fe:
10.@@@.18:8030
be :
10.@@@.18:9050
10.@@@.19:9050
10.@@@.20:9050
10.@@@.21:9050
doris 页面:
http://10.@@@.18:8030/home 用户密码: root 123456
mysql入口:
mysql -uroot -P9030 -h10.@@@.18 密码: 123456
相关文章:
doris集群物理部署保姆级教程
doris物理安装 1、安装要求 Linux 操作系统版本需求 查看CentOs版本(>7.1) cat /etc/redhat-release 1)设置系统最大打开文件句柄数 vi /etc/security/limits.conf soft nofile 65536hard nofile 65536 echo ‘’’ soft nofile 655360hard nofile 655…...
探囊取物之多形式登录页面(基于BootStrap4)
基于BootStrap4的登录页面,支持手机验证码登录、账号密码登录、二维码登录、其它统一登录 低配置云服务器,首次加载速度较慢,请耐心等候;演练页面可点击查看源码 预览页面:http://www.daelui.com/#/tigerlair/saas/pr…...
【ONLYOFFICE】| 桌面编辑器从0-1使用初体验
目录 一. 🦁 写在前面二. 🦁 在线使用感受2.1 创建 ONLYOFFICE 账号2.2 编辑pdf文档2.3 pdf直接创建表格 三. 🦁 写在最后 一. 🦁 写在前面 所谓桌面编辑器就是一种用于编辑文本、图像、视频等多种自媒体的软件工具,具…...
20、PHP字符串的排列(含源码)
题目: PHP字符串的排列? 描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列。 例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 输入描述: 输入一个字符串,长度不超过9(可…...
Linux 标准IO的fopen和fclose
getchar(),putchar() ‐‐‐‐ 一个字符 gets(buf),puts(buf) ‐‐‐‐ 一串字符 scanf(),printf() ‐‐‐‐ 一个字符,一串字符都可以 fopen函数的形式 FILE * fopen(constchar *path , cost char *mode) /* * description : 打开一个文件 * param ‐ path…...
一个计算密集小程序在不同CPU下的表现
本文比较了几款CPU对同一测试程序的比较结果,用的是Oracle公有云OCI上的计算实例,均分配的1 OCPU,内存用的默认值,不过内存对此测试程序运行结果不重要。 本文只列结果,不做任何评价。下表中,最后一列为测…...
圈子系统搭建教程,以及圈子系统的功能特点,圈子系统,允许二开,免费源码,APP小程序H5
圈子是一款社区与群组的交友工具。你可以在软件内创造一个兴趣的群组从而达到按圈子来交友的效果用户可以根据自己的兴趣爱好。 1. 创建圈子 轻松创建专属圈子,支持付费型社群。 2. 加入圈子 加入不同圈子,设置不同名片,保护隐私。 3. 定…...
递归算法练习
112. 路径总和 package Tree;import java.util.HashMap; import java.util.Map;class TreeNode {int val;TreeNode left;TreeNode right;public TreeNode(int val) {this.val val;} }/*** 求 树的路径和* <p>* 递归 递减* <p>* 询问是否存在从*当前节点 root 到叶…...
WebDriver 类的常用属性和方法
目录 🎍简介 🎊WebDriver 核心概念 🎉WebDriver 常用属性 🎁WebDriver 常用方法 🐷示例代码 🎪注意事项 🎐结语 🧣参考资料 🎍简介 Selenium WebDriver 是一个用…...
基于x86+FPGA+AI轴承缺陷视觉检测系统,摇枕弹簧智能检测系统
一、承缺陷视觉检测系统 应用场景 轴类零件自动检测设备,集光、机、软件、硬件,智能图像处理等先进技术于一体,利用轮廓特征匹配,目标与定位,区域选取,边缘提取,模糊运算等算法实现人工智能高…...
短剧小程序系统cps分销开发搭建
短剧小程序系统CPS分销开发搭建是一个相对复杂但具有广阔商业前景的过程。以下是关于短剧小程序系统CPS分销开发搭建的详细步骤和要点: 需求分析与市场调研: 深入了解市场需求、用户画像和竞品分析,明确产品定位和功能需求。研究目标用户的消…...
代理IP的10大误区:区分事实与虚构
在当今的数字时代,代理已成为在线环境不可或缺的一部分。它们的用途广泛,从增强在线隐私到绕过地理限制。然而,尽管代理无处不在,但仍存在许多围绕代理的误解。在本博客中,我们将探讨和消除一些最常见的代理误解&#…...
数组-长度最小的子数组
M长度最小的子数组(leetcode209) /*** param {number} target* param {number[]} nums* return {number}*/ var minSubArrayLen function(target, nums) {const n nums.length;let ans n 1;let sum 0; // 子数组元素和let left 0; // 子数组…...
深度学习之交叉验证
交叉验证(Cross-Validation)是一种用于评估和验证机器学习模型性能的技术,尤其是在数据量有限的情况下。它通过将数据集分成多个子集,反复训练和测试模型,以更稳定和可靠地估计模型的泛化能力。常见的交叉验证方法有以…...
使用 Python 五年后,我发现学 python 必看这三本书!少走一半弯路
第一本 《Python编程-从入门到实践》 适合零基础的读者 豆瓣评分:9.1 推荐指数:5颗星 推荐理由: 本书是针对所有层次的 Python 读者而作的 Python 入门书。全书分为两部分: 第一部分介绍使用Python 编程所必须了解的…...
React@16.x(45)路由v5.x(10)源码(2)- history
目录 1,作用1.1,createBrowserHistory1.2,createHashHistory1.3,createMemoryHistory 2,history 对象的属性2.1,action2.2,push / replace / go / goBack / goForward2.3,location2.…...
grpc学习golang版( 八、双向流示例 )
系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 第五章 多proto文件示例 第六章 服务器流式传输 第七章 客户端流式传输 第八章 双向流示例 文章目录 一、前言二、定义proto文件三、编写server服务端四、编写client客…...
SpringBoot学习05-[SpringBoot的嵌入式Servlet容器]
SpringBoot的嵌入式Servlet容器 嵌入式Servlet容器servlet容器-嵌入式servlet容器配置修改通过全局配置文件修改修改添加实现了WebServerFactoryCustomizer接口的bean来进行修改 servlet容器-注册servlet三大组件应该如何注册呢?servlet3.0规范提供的注解方式进行注…...
查看Oracle是哪个Oracle_home 下启动的
[rootrac1 ~]# ps -ef|grep smon root 413 24903 0 22:30 pts/0 00:00:00 grep --colorauto smon root 27165 1 0 22:11 ? 00:00:09 /u01/app/19.0.0/grid/bin/osysmond.bin grid 27784 1 0 22:12 ? 00:00:00 asm_smon_ASM1 oracl…...
重温react-06(初识函数组件和快速生成格式的插件使用方式)
开始 函数组件必然成为未来发展的趋势(个人见解),总之努力的去学习,才能赚更多的钱.加油呀! 函数组件的格式 import React from reactexport default function LearnFunction01() {return (<div>LearnFunction01</div>) }以上是函数式组件的组基本的方式 快捷生…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
