复习sql-内连接,左外连接,右外连接,全外连接,交叉连接
数据表准备 学生表 和 课程表
内连接 join 或 innner join筛选出满足条件的列,where也可以实现这种功能。
1SELECT * FROM student JOIN course ON student.student_id = course.stu_id
结果
注: 如果不加where, 是笛卡尔积的结果,同交叉连接
12SELECT * FROM student JOIN course 或者SELECT * FROM student, course
外连接左外连接 left join 或者 left outer join以第一个表为基础,第二个表找不到的项就设置为NULL。
1SELECT * FROM student LEFT JOIN course ON student.student_id = course.stu_id
结果
右外连接 right join 或者 right outer join以第二个表为基础,第一个表找不到的项就设置为NULL。
1SELECT * FROM student RIGHT JOIN course ON s ...
服务器GPU温度过高挂掉排查记录
前言印象深刻的跨年日,2023年最后一天在实验室维修服务器。
服务器GPU挂掉跑深度学习的代码的时候发现中断了。通过命令查看:
1nvidia-smi
显示
1Unable to determine the device handle for GPU 0000:01:00.0: Unknown Error。
感觉很莫名其妙。通过重启大法之后,又能用一段时间。
1shutdown -r now
但是过了一个小时左右又会挂掉。不能从根本解决问题。那么到底为什么GPU会自己挂掉呢?
问题排查通过查看日志定位错误原因:
1nvidia-bug-report.sh
在当前目录下生成了nvidia-bug-report.log日志文件。查看到日志文件的内容如下:
网上查找一下这个报错码79https://forums.developer.nvidia.com/t/gpu-has-fallen-of-the-bus/122124发现要么是电源问题,要么是温度过高问题。
重现问题,查看温度日志如果判断是否是GPU温度过高呢?需要打一个温度日志,再运行一下代码,看GPU温度是否超过了shutdo ...
从JVM角度对java中引用的理解
学java这么久了,对java引用越来越深刻,好好梳理一下下面三个问题,带着问题进行理解。
什么是引用?引用存放在jvm哪个区域?引用是一种变量类型。引用类型占四个字节。变量类型分为基本类型和引用类型。我们知道java中有8种基本数据类型+Sring引用类型:byte,short,int,long,float,double,char,boolean。引用类型一般为实例对象的引用。可以理解为该对象存放的地址。注意引用和对象时不一样的。举例:
123456789public class Test { private Object instanceVariable = new Object(); private int instanceVariableInt; public void method() { Object localVariable = this.instanceVariable; // 假设程序刚执行完这一行 }}
上面的new Object()为实例对象,存放在堆中。ins ...
第五章Netty第二节协议设计:自定义编解码器
协议设计与解析为什么需要协议TCP/IP消息传输是基于二进制流的方式,没有边界。协议的目的就是划定消息的边界,制定通信双方要共同遵守的通信规则。例如:在网络上传输
1下雨天留客天留我不留
是中文中一句著名的无标点符号的句子,没有标点符号,有很多种拆解方式,不同拆解有不同的意思。这就是说明了标点符号的重要性,也就是消息边界的重要性。网络中的协议,也就是给网络传输的信息加上「标点符号」。下面一种协议较为常用
1定长字节表示内容长度 + 实际内容
netty中通过LengthFieldBasedFrameDecoder来实现。
redis协议举例1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465NioEventLoopGroup worker = new NioEventLoopGroup();byte[] LINE = {13, 10};try { ...
第五章Netty第一节 粘包和半包
粘包与半包粘包现象:发送abc def,接受到abcdef
原因:
应用层:接收方ByteBuf设置太大(Netty默认是1024)
传输层滑动窗口: 假设发送方256 bytes表示一个完整的报文,接收方的滑动窗口来不及处理且滑动窗口足够大,导致多个报文在一个滑动窗口中,导致粘包。(TCP协议)
Nagle算法:会造成粘包。Nagle算法是TCP协议中的一种机制,有时候发送一个字节,也需要加入TCP头和IP头,有点浪费网络。为了提高网络利用率,会将少量数据进行延迟发送,积攒起来一起发送。会造成粘包现象。
半包现象:发送abcdef,接受abc def原因:
应用层:接收方的ByteBuf小于实际发送的数据,导致一个数据报文被拆分了。
传输层滑动窗口:假设接收方的滑动窗口大小为128bytes,这时候发送方发了256bytes,滑动窗口接受不过来,让发送方只能先发128bytes,等待ACK后,才能发送剩余的数据。造成一个完整的报文被拆分开。(传输层TCP协议)
MSS(max segment size)限制:当发送的数据超出MSS限制后,会将数据切分后发送,会造成半包。 ...
第四章Netty第四节案例实现echo server
需求实现一个echo server。通俗的说就是客户端发送什么就会接受到什么。echo的意思“回声”。
服务端12345678910111213141516171819202122232425new ServerBootstrap() .group(new NioEventLoopGroup()) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<NioSocketChannel>() { @Override protected void initChannel(NioSocketChannel ch) { ch.pipeline().addLast(new ChannelInboundHandlerAdapter(){ ...
初学Netty SeverBootstrap和Bootstrap踩坑
错误描述no further information: /127.0.0.1:80901Exception in thread "main" io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: no further information: /127.0.0.1:8090
解决看到问题很明显,连接失败?刚开始以为是ip+端口号写错了,检查发现没有错误。后来才发现server端ServerBootstrap写错成了客户端的BootStrap将
1new Bootstrap()
修改为:
1new ServerBootstrap()
问题原因SeverBootstrap和Bootstrap都是Netty的启动类,他们的主要作用就是配置相关参数(IP,端口等)并启动整个Netty服务。ServerBootstrap:用于服务端的启动Boostrap:用于客户端的启动
第四章Netty第三节handler&pipeline&ByteBuf
Handler & PipelinePipeline中执行顺序ChannelHandler用来处理Channel上的各种事件,分为入站和出站。ChannelHandler被连成一串就是pipeline.
入站处理器通常是ChannelInBoundHanderAdapter的子类,主要用来读取客户端的数据,写回结果
出站处理器通常是ChannelOutboundHandlerAdapter的子类,主要对写回结果进行加工。打个比喻,channel是产品的加工车间。pipeline是车间中的流水线,经过很多工序的加工:先经过一道道入站工序,再经过一道道出站工序最终变成产品。服务端:1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253new ServerBootstrap() .group(new NioEventLoopGroup()) .channel(NioServerSocketChannel.class) . ...
第四章Netty第二节入门案例+channel,future,promise介绍
需求开发一个简单的服务器端和客户端
客户端向服务器端发送 hello, world
服务器仅接收,不返回12345<dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.39.Final</version></dependency>
服务端123456789101112131415new ServerBootstrap() .group(new NioEventLoopGroup()) // 1 .channel(NioServerSocketChannel.class) // 2 .childHandler(new ChannelInitializer<NioSocketChannel>() { // 3 protected void initChannel(NioSocketChanne ...
炼丹小技巧1:通过TensorBoard查看loss走向判断模型是否收敛
1.目的我们在训练模型的时候,不知道自己的超参数epochs设置的是够正确,能否训练出一个足够好的模型?通过参看loss的走向,如果loss稳定在较低值附近,就可以判断该模型已经收敛。可以通过plt.show自己绘制loss的走向图,当然也可以通过TensorBoard绘制loss的走向图,更加高大上。TensorBoard绘图简单原理如下:1.将要绘制的数据保存为一个文件 2.用tensorboard命令读取文件并绘制图形
2.步骤安装
1pip install tensorboard
训练模型代码中保存loss值
1234567from torch.utils.tensorboard import SummaryWriterwriter = SummaryWriter("logs") # 写入文件存放的位置for i in range(100): writer.add_scalar("y=2*x", 2 * i, i) # "y=2*x"为图片描述,2 * i 为纵坐标, i为step(横坐标)writ ...