对于存在分栏的pdf文件,可以利用fitz库进行处理: 方式一:利用ocr技术对图片进行处理
方式二:转换成html文件后进行处理
代码: import os import pytesseract import cv2 as cv import fitz from PIL import Image from tqdm import tqdm class PdfHandler: def run(self): '''执行入口''' # 将指定pdf文件转换成html文件 self.pdf_to_html('test.pdf','test.html') # 解析html文件 self.parse_html('test.html') # 将pdf文件转换成图片 self.pdf_to_img('test.pdf','img_dir',5,5,0) # 解析图片 for img_name in os.listdir('img_dir'): abs_img_name = f'img_dir/{img_name}' self.parse_img(abs_img_name) def pdf_to_html(self,pdf_path,html_path): ''' pdf文件转换成html文件 :param pdf_path: pdf文件路径 :param html_path: html文件路径 :return: ''' # 打开pdf文件,并新建html文件 with fitz.open(pdf_path) as pdf,open(html_path,'w',encoding='utf-8',newline='') as html_file: html_content = ''' <!
简介:保留有效位
法一:大多数博客上的方法
如果想要保留n位小数
根据C++官网上的解释,该函数没有指定的返回类型,并且该函数用于设定输出操作上的小数精确位。
然后返回值中解释:未指定返回值,这个函数仅用于数据流修改操作上。
法一弊端,当我们需要将精确后的小数保存(将a精确后保存赋值给b)起来的话,使用setprecision函数就不行了。
法二:使用stringstream类
在这里我们使用第一种方式,可以看到第一种用法解释是设置流的格式标志(format flag)为参数 fmtfl 的形式
这里就可以看到fixed的意思是将小数设置为定点表示法
然后后面的ss.precision(3)就是保留3位
放在一起的意思就是小数点后保留3位有效位。
至于ss.str(),可以看到官网解释如下,得到字符串流中保存的内容,注意返回位std::string类型:
法三:手动计算,结束floor函数
这个算法的思想就是先将该数乘以1000,就得到了小数点后三位,然后+0.5是什么意思呢?
大家想一想哈,a*1000=1123.456789对不对,我们一般保留有效位都是需要四舍五入的,
在a*1000之后+0.5不就自动实现了四舍五入了吗?然后在使用地板函数进行取整,再除1000不就完美实现了吗?
总结:
第一种方法适用于一次性处理大批数据,比如说如果你想要将很多数据一次写入txt中。
第二种方法比较适合即算即用,快速简便。
Mysql数据库优化策略简析 当数据库出现性能瓶颈时,我们需要进行优化,目前有两类的优化策略
硬件层优化:增加机器资源,提升性能 软件层优化:SQL调优,表结构优化,读写分离,分库分表,数据库集群 数据库性能瓶颈的对外表现:
大量请求被阻塞:高并发场景下,连接数不够,大量请求处于阻塞状态 SQL操作变慢:比如查询上亿数据的表,没有命中索引进行了全表扫描 存储问题:磁盘不够了 主要简单解析一下软件层的优化
1.SQL调优 在这个方向上,投入少部分精力往往就能获得较大的收益,是进行数据库优化的第一选择手段
SQL调优的目的就是让那些慢SQL变快,手段就是让SQL执行尽量命中索引
第一步:开启SQL慢记录 如果你使用的是 Mysql,需要在 Mysql 配置文件中配置几个参数即可。
slow_query_log=on long_query_time=1 slow_query_log_file=/path/to/log 第二步:查看慢SQL语句是否命中索引 常常会用到 explain 这个命令来查看 SQL 语句的执行计划,通过观察执行结果很容易就知道该 SQL 语句是不是全表扫描、有没有命中索引。
explain select id, age, gender from user where name = 'xxxx' 返回有一列叫“type”,常见取值有:
ALL、index、range、 ref、eq_ref、const、system、NULL(从左到右,性能从差到好)
ALL 代表这条 SQL 语句全表扫描了,需要优化。一般来说需要达到range 级别及以上。
2.表结构优化 以一个场景举例说明:
“user”表中有 user_id、nickname 等字段,“order”表中有order_id、user_id等字段,如果想拿到用户昵称怎么办?一般情况是通过 join 关联表操作,在查询订单表时关联查询用户表,从而获取导用户昵称。
但是随着业务量增加,订单表和用户表肯定也是暴增,这时候通过两个表关联数据就比较费力了,为了取一个昵称字段而不得不关联查询几十上百万的用户表,其速度可想而知。
这个时候可以尝试将 nickname 这个字段加到 order 表中(order_id、user_id、nickname),这种做法通常叫做数据库表冗余字段。这样做的好处展示订单列表时不需要再关联查询用户表了。
冗余字段的做法也有一个弊端,如果这个字段更新会同时涉及到多个表的更新,因此在选择冗余字段时要尽量选择不经常更新的字段。
3.读写分离 将数据库分为两类,一类专门处理读请求,一类专门处理写请求,二者之间通过数据库的复制来进行数据同步,比如mysql主从复制。
Mysql主从复制 1.什么是主从复制 主从复制是用来建立一个和主数据库完全一样的数据库,称为从数据库;
主数据库一般是准实时的业务数据库。
2.主从复制的作用 1.做数据的热备
作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。
2.有利于架构的扩展。
业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。
3.读写分离,使数据库能支撑更大的并发。
在报表服务中尤其重要。由于部分报表服务的sql语句非常的慢,导致锁竞争,影响前台服务。如果前台使用master,报表服务使用slave,那么报表sql将不会造成前台锁,保证了前台速度。
3.主从复制的原理 第一步:Master节点将数据的改变记录成二进制日志(Binary log,简称binlog),当Master上的数据发生改变时,则将其改变写入二进制日志中。 第二步:Slave节点会在一定时间间隔内对Master的二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/O线程请求Master的二进制事件。 第三步:同时Master节点为Slave的每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至Slave节点本地的中继日志(Relay log)中,Slave节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,即解析成sql语句逐一执行,使得其数据和Master节点的保持一致,最后I/O线程和SQL线程将进入睡眠状态,等待下一次被唤醒。 中继日志通常位于OS缓存中,所以中继日志的开销很小。
简言之可分为下面几个步骤:
一、主库的更新事件会被写到bin log日志中。
二、从库启用slave服务,发起连接,连接到主库。
三、从库创建一个I/O线程,从主库读取bin log日志的内容并写入到relay log日志中。
四、从库创建一个SQL线程,从relay log里面读取内容,将更新内容写入到从库。
复制过程有一个很重要的限制,即复制在Slave上是串行化的,也就是说Master上的并行更新操作不能在Slave上并行操作,所以复制操作是存在延时的!
4.主从同步的延时如何解决? 虽然主从架构帮我们解决读的瓶颈,但是由于主从之间需要数据同步,这天然就存在一定延时。
在这延时窗口期内,从库的读只能读到一个旧数据,这就是主从同步的延时问题
总共有五种解决方案
为了解决主从延迟,数据不一致的情况,我们可以采用以下这几种方案:
忍受大法
数据库同步写方案
选择性强制读主库
中间件选择路由法
缓存路由大法
方案1:忍受大法 不管他,反正过了这个延时窗口数据就会是一致的,如果业务对数据的一致性要求不高,可以采用这种方法。
方案2:数据同步写方案 主从数据同步方案,一般都是采用的异步方式同步给从库。
我们可以将其修改为同步方案,主从同步完成,主库上的写才能返回。
流程如下:
https://blog.csdn.net/qq_44721831/article/details/104123519
2、通过systemctl status firewalld查看firewalld状态,发现当前是dead状态,即防火墙未开启 3、通过systemctl start firewalld开启防火墙,没有任何提示即开启成功。 4、再次通过systemctl status firewalld查看firewalld状态,显示running即已开启了。 5、如果要关闭防火墙设置,可能通过systemctl stop firewalld这条指令来关闭该功能。6、再次执行执行firewall-cmd --permanent --zone=public --add-port=27017/tcp,提示success,表示设置成功,这样就可以继续后面的设置了。
日常测试的时候,需要连接其他表而删除某些脏数据,按照正常的查询的写法,会这样写删除语句:
DELETE from `order` where id in (SELECT o.id from `order` o LEFT JOIN customer c on o.customer_id =c.id where o.customer_id is not null and c.id is null) 然后...... You can't specify target table 'order' for update in FROM clause
意思是:不能先select出同一表中的某些值,再update这个表,即不能依据某字段值做判断再来更新某字段的值。
好吧~~~
百度研究一番这么解决,可以多表连接进行删除,这里也疑惑了下,这个写法为啥看书、看视频的时候都不见介绍???
-- 删除order表的数据 DELETE o from `order` o LEFT JOIN customer c on o.customer_id =c.id where o.customer_id is not null and c.id is null -- 删除customer表数据 DELETE c from `order` o LEFT JOIN customer c on o.
目录前言BeanShell简介BeanShell元件所支持的变量、方法Beanshell的内置方法logvarspropsctxSamplerDataLabel / SampleLabelIsSuccessprev / SampleResultprev常用方法SampleResult常用方法ResponseDataResponseCode/ResponseMessageFailure/FailureMessage/设置响应断言FileNameArguments对象
前言 本文是自己在日常使用过程中整理前辈们的知识,以及自己日常使用整理输出的结果,由于汇集了过多的文章、时间太长,无法一一列举曾经引用过哪些前辈了,实属抱歉。也限于个人水平有限,若有哪些写得不对的也欢迎指正。
本文主要介绍beanshell中的常用方法类以及使用案例。
友情提示:对于初学者,建议先捋清楚各个原件的执行顺序和作用域,还需要一点点Java基础。
BeanShell简介 什么是BeanShell 官网 官方文档 BeanShell是由java编写的,是一个轻量级的脚本语言,也相当于一个小巧免费的JAVA源码解释器,支持对象式的脚本语言特性,亦可嵌入到JAVA源代码中,能动态执行JAVA源代码并为其扩展了脚本语言的一些特性。 简单的理解:beanshell就是一个能写java代码的 JMeter中与BeanShell的关系 首先,JMeter也是由java编写的,而java运行时需要先编译,然后才可以运行;而BeanShell是一款解释器,直接可能运行源代码; 所以,两者其实没有必然的联系,只不过是把beanshell嵌入到jmeter这个工具里面,然后通过jmeter定义的方法与beanshell进行交互; 我们可以通过BeanShell做什么? 读写请求、响应相关的信息(包括请求头、请求信息、响应头、响应码、响应体等) 执行Java代码实现一定逻辑计算(请求加密、复杂的断言方式) BeanShell元件所支持的变量、方法 为什么要说这个?因为不同的Beanshell 支持的变量不一样,直接使用会报错。如下图,可以通过元件知道支持什么变量。
BeanShell 取样器 SampleResult、ResponseCode、ResponseMessage、IsSuccess、Label、FileName、ctx、vars、props、log BeanShell 预处理程序 ctx、vars、props、prev、sampler、log 后置处理器:BeanShell PostProcessor ctx、vars、props,prev、log BeanShell断言 Read/Write: Failure、FailureMessage、SampleResult、vars、props、log ReadOnly: ResponseData、ResponseCode、ResponseMessage、ResponseHeaders、RequestHeaders、SampleLabel、SamplerData、ctx BeanShell 定时器 ctx、vars、props、log、prev BeanShell 监听器 ctx、vars、props 方法类适用的元件:
方法名 适用元件 说明 SampleResult BeanShell 取样器、BeanShell断言 需要import对象 ResponseCode BeanShell 取样器、BeanShell断言 ResponseMessage BeanShell 取样器、BeanShell断言 IsSuccess BeanShell 取样器 Label BeanShell 取样器 FileName BeanShell 取样器 ctx 所有元件 vars 所有元件 props 所有元件 log 除了监听器 prev BeanShell 预处理程序、后置处理器、定时器 sampler BeanShell 预处理程序 Failure BeanShell断言 FailureMessage BeanShell断言 ResponseData BeanShell断言 ResponseHeaders BeanShell断言 RequestHeaders BeanShell断言 SampleLabel BeanShell断言 SamplerData BeanShell断言 Beanshell的内置方法 beanshell常用API - 链接
一等有空再整理,下面的命令测试过了
修改配置:vim config/server.properties: advertised.listeners=PLAINTEXT://172.16.1.102:9092 log.dirs=/usr/local/kafka_2.12-2.6.2/kafka_logs(日志文件路径可改可不改) 启动kafka:bin/kafka-server-start.sh config/server.properties 新建一个对话, 创建主题test:bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test(replication-factor 定义副本数,partitions 定义分区数) (删除主题test:先修改配置:vim config/server.properties:delete.topic.enable=true 删除:bin/kafka-topics.sh --zookeeper localhost:2181 --delete --topic test) 查看所有主题:bin/kafka-topics.sh --list --zookeeper localhost:2181(此时可以看到创建好的主题test) 1.创建topic bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic 10000_bikeinfo_220126 2.查看所有主题: bin/kafka-topics.sh --list --zookeeper localhost:2181 3.查看topic 消息数 bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list 121.46.151.102:9092 --topic 10000_bikeorder_220125 4.消费kafka消息 bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic 10000_bikeorder_220125 bin/kafka-topics.sh --zookeeper localhost:2181 --delete --topic 10000_bikeorder_0122 bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic 10003_usercredit_69574 bin/kafka-topics.
目录centos库文件丢失紧急救援删除库文件救援模式
centos库文件丢失紧急救援 删除库文件 在centos的lib目录当中有很多的库文件,有些库文件被很多的程序依赖,比如libc.so.6就被大多数的程序依赖,如果这个库文件删除掉,该如何进行救援呢?
通过ldd可以查出来某个程序依赖的库文件,如下所示
[root@c71 ~]# ldd `which cat` linux-vdso.so.1 => (0x00007ffe151dd000) libc.so.6 => /lib64/libc.so.6 (0x00007efc9e65e000) /lib64/ld-linux-x86-64.so.2 (0x00007efc9ea2c000) [root@c71 ~]# ldd `which tac` linux-vdso.so.1 => (0x00007fff8c3fb000) libc.so.6 => /lib64/libc.so.6 (0x00007fde7a66d000) /lib64/ld-linux-x86-64.so.2 (0x00007fde7aa3b000) [root@c71 ~]# ldd `which less` linux-vdso.so.1 => (0x00007fffe9bcd000) libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007fbd42d52000) libc.so.6 => /lib64/libc.so.6 (0x00007fbd42984000) /lib64/ld-linux-x86-64.so.2 (0x00007fbd42f7c000)s和cat都依赖 /lib64/ld-linux-x86-64.so.2 这个库文件,这个库文件是一个共享库,在系统之上就存在一份,但是好多命令都需要调用这个库,如果把这个库文件删除,那ls和cat命令就都无法使用了。 那现在我们将这些程序共同依赖的libc.so.6库文件给删除,如下所示:
[root@c71 ~]# rm -rf /lib64/libc.so.6 /bin/bash: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory # 删除之后发现大部分命令都不能使用了; [root@c71 ~]# cat /etc/passwd cat: error while loading shared libraries: libc.
正则表达式 用一个“字符串公式”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征 shell与正则表达式 以下命令支持正则表达式
locate
sed
find
grep
vim
awk
正则表达式字符类型 元字符 定位符 匹配符 限定符 POSIX字符 元字符符号 定位符
定位符 说明 ^ 锚定开头^a以a开头,默认锚定一个字符 $ 锚定结尾a$ 以a结尾 默认锚定一个字符 \b 锚定单词的开头或者结尾 窍门: 同时使用^ 和 $ 是精确匹配
匹配符
匹配符 说明 . 匹配除回车以外的任意一个字符 () 字符串分组 [] 定义字符类,匹配括号中的一个字符(可以指定范围,例如[a-z]) [^] 表示否定括号中出现字符类中的字符,取反 \ 转义字符 | 或 \d 匹配一个0-9数字 \D 匹配一个非数字字符 \w 匹配字母或数字下划线 \s 匹配任意的空白符 限定符