shangjg3
码龄14年
关注
提问 私信
  • 博客:195,434
    社区:1
    195,435
    总访问量
  • 309
    原创
  • 36,857
    排名
  • 3,158
    粉丝
  • 153
    铁粉
IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:河南省
  • 加入CSDN时间: 2010-12-26
博客简介:

shangjg3的博客

查看详细资料
  • 原力等级
    当前等级
    6
    当前总分
    2,657
    当月
    28
个人成就
  • 获得1,686次点赞
  • 内容获得22次评论
  • 获得1,249次收藏
  • 代码片获得3,833次分享
创作历程
  • 124篇
    2024年
  • 185篇
    2023年
成就勋章
TA的专栏
  • PyTorch深度学习实战
    付费
    28篇
  • 大数据从入门到精通
    付费
    95篇
  • 数据湖Hudi
    付费
    12篇
  • Doris
    付费
    22篇
  • Java总结
    付费
    70篇
  • 算法和数据结构
    12篇
  • C语言
    8篇
  • Java
    18篇
  • 数据库
    20篇
  • Redis
    12篇
  • C++
    5篇
兴趣领域 设置
  • 大数据
    hadoophivespark数据仓库etl
创作活动更多

超级创作者激励计划

万元现金补贴,高额收益分成,专属VIP内容创作者流量扶持,等你加入!

去参加
  • 最近
  • 文章
  • 代码仓
  • 资源
  • 帖子
  • 课程
  • 关注/订阅/互动
  • 收藏
搜TA的内容
搜索 取消

Java并发编程(26)—— Unsafe类的源码解读以及使用场景

堆外是相对于JVM的内存来说的,通常我们应用程序运行后,创建的对象均在JVM内存中的堆中,堆内存的管理是JVM来管理的,而堆外内存指的是计算机中的直接内存,不受JVM管理。相比C和C++的开发人员,作为一名Java开发人员是十分幸福的,因为在Java中程序员在开发时不需要关注内存的管理,对象的回收,因为JVM全部都帮助我们完成了。对于Java中并发编程,Java的源码里面存着这大量的Unsafe类的使用,主要使用的是和CAS操作相关的三个方法,所以搞清楚这三个方法,对看懂Java并发编程的源码有很大帮助。
原创
发布博客 2024.09.09 ·
323 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

Java并发编程(24)—— JUC并发编程类库详解

CyclicBarrier 是一个同步辅助类,用于让一组线程到达一个屏障(barrier)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。这意味着在修改操作发生时,会创建一个新的数组,并将现有的所有元素复制到新数组中,然后在新数组上进行修改。这意味着在修改操作发生时,会创建一个新的数组,然后将现有的所有元素复制到新数组中,并在新数组上进行修改。当一个线程到达交换点时,它会调用 exchange() 方法,该方法会尝试将该线程的数据与另一个线程的数据交换。
原创
发布博客 2024.09.03 ·
261 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

Java并发编程(23)—— Volatile在并发编程中的应用

它是CPU或编译器在内存随机访问操作中的一个同步点,确保此点之前的所有读写操作都执行完毕后,才能开始执行此点之后的操作。内存屏障(Memory Barrier)是一种同步机制,用于防止处理器或编译器对内存操作的指令进行重排序。在Java内存模型(JMM)中,每个线程都有自己的工作内存(也称为本地内存),用于存储共享变量的副本。是Java中的一个关键字,用于修饰变量,特别是那些会被多个线程访问和修改的共享变量。变量,JVM会在其读写过程中插入特定的内存屏障指令,以确保其内存语义的正确实现。
原创
发布博客 2024.08.30 ·
106 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

Java并发编程(21)—— Atomic 原子类总结

第一步,因为对象的属性修改类型原子类都是抽象类,所以每次使用都必须使用静态方法 newUpdater()创建一个更新器,并且需要设置想要更新的类和属性。该类将整数值与引用关联起来,可用于解决原子的更新数据和数据的版本号,可以解决使用 CAS 进行原子更新时可能出现的 ABA 问题。该类将整数值与引用关联起来,可用于解决原子的更新数据和数据的版本号,可以解决使用 CAS 进行原子更新时可能出现的 ABA 问题。基本类型原子类只能更新一个变量,如果需要原子更新多个变量,需要使用 引用类型原子类。
原创
发布博客 2024.08.30 ·
115 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

Java并发编程(22)—— CurrentHashMap源码分析

java 并发包中提供的是一个线程安全且高效的HashMap ,也是面试的高频考点。下面将围绕主题:ConcurrentHashMap 如何实现高效地线程安全?以及在Java8中它从设计实现上有哪些演进?这篇文章一开始我以为会比较简单,但是在深入源码分析时,遇到了很大的阻碍,比前面我们分析AQS以及读写锁的源码要难理解的多,断断续续也写了4天了。如果你看完还是没有理解的话,那我在这里表示深深的歉意,同时也欢迎你和我一起沟通。
原创
发布博客 2024.08.30 ·
141 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

PyTorch深度学习实战(27)—— PyTorch分布式训练

分布式训练等价于增大了一次训练的batch_size,传统的批标准化仅是对一个batch上的数据进行操作,在分布式训练中不同进程对不同的数据进行操作,相当于每一个进程的BN层处理的batch。在确保每个进程执行的操作没有问题后,可以尝试先在较小的集群上(例如,单个节点启动两个进程,两个节点启动两个进程等)启动分布式训练,以此验证进程间的同步与协作是否出错,这样的操作可以降低复现错误、调试程序的成本。在分布式训练中,不同进程之间需要通信来完成参数的汇总更新,因此进程间的同步是至关重要的。
原创
发布博客 2024.08.29 ·
659 阅读 ·
7 点赞 ·
0 评论 ·
0 收藏

PyTorch深度学习实战(26)—— PyTorch与Multi-GPU

至此,网络完成了一次反向传播,网络参数仅在GPU-0上进行更新。在上述流程中,只需要GPU-0将数据与模型加载至多块GPU上,各GPU就可以并行地进行前向传播与反向传播,也就是说并行中的一个epoch完成了单个GPU多个epoch的工作,从而加速了模型的训练。非阻塞通信可以将进程本身的计算时间与进程间的通信时间重叠起来,即在完成计算的同时,交由特定的通信模块完成通信部分。不难发现,在MPI的帮助下,不同进程之间的通信是比较容易的,因此读者应该侧重于理解分布式计算的思想,并将该思想应用在实际的程序设计当中。
原创
发布博客 2024.08.29 ·
474 阅读 ·
5 点赞 ·
0 评论 ·
0 收藏

MySQL慢查询日志使用与分析

MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阈值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。由慢查询日志来查看哪些SQL超出了我们的最大忍耐时间值,比如一条SQL执行超过5秒钟,我们就算慢SQL,希望能收集超过5秒钟的SQL,结合之前explain进行全面分析。1.慢查询的开启并捕获:开启慢查询日志,设置阈值,比如超过5秒钟的就是慢SQL,至少跑1天,看看生产的慢SQL情况,并将它抓取出来。
原创
发布博客 2024.08.28 ·
483 阅读 ·
3 点赞 ·
0 评论 ·
4 收藏

Java并发编程(20)—— ConcurrentHashMap详解

需要高效的并发性能:相对于 Hashtable 或者 Collections.synchronizedMap() 等同步的哈希表实现,ConcurrentHashMap 在高并发情况下有更好的性能表现。1.锁的颗粒度更小,当数据落在数组上时,使用cas锁头节点,当发生冲突时数据落在节点上时,使用synchronized锁冲突的节点减少了并发冲突。ConcurrentHashMap是Java并发很重要的组件,也是大厂面试经常考察的对象,下面我就全面来详解ConcurrentHashMap。
原创
发布博客 2024.08.22 ·
85 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

Java并发编程(19)—— CompletableFuture异步多线程

crud系统真的很少用,一般其实都是中间件类的系统会大量的运用并发编程的知识,各种请求都是异步化的执行,比如说大家可以去看看rocketmq、elasticsearch这一类中间件的源码,他们会经常用到。或者说大家在自己公司里研发一些非crud类的系统,比如说一些公司内自研的一些底层系统,基础系统,中间件系统,其实也会经常用到并发编程,也就是异步编程的模式,那如果大家未来有可能用到异步编程的话,建议还是来了解一下今天的知识点,因为传统的异步编程其实控制你开的那个线程其实真的很麻烦。
原创
发布博客 2024.08.22 ·
146 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

Java并发编程(18)—— 常用并发工具类

生产者线程将元素放入队列,消费者线程从队列中取元素,队列为空时消费者线程阻塞。让一组线程到达一个共同的同步点,然后一起继续执行。是一个线程安全的队列,支持阻塞操作,适用于生产者-消费者模式。控制访问资源的线程数,可以用来实现限流或访问控制。适用于需要所有线程在某个点都完成后再继续的场景。适用于主线程需要等待多个子线程完成任务的场景。是一个线程安全且高效的哈希表,支持并发访问。在资源有限的情况下,控制同时访问的线程数量。适用于需要频繁对数值进行无锁操作的场景。一个线程(或多个)等待其他线程完成操作。
原创
发布博客 2024.08.21 ·
63 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

PyTorch深度学习实战(25)—— 使用向量化思想解决实际问题

显然,这里需要在左上角和右下角坐标值的基础上构造出$n \times n$ 的结果,然后对feature map进行整数数组索引,从而得到一个$C \times N \times n \times n$ 的结果,最后相乘便完成了ROI Align操作。本文通过三个示例说明了向量化思想在实际场景中的应用,读者应该仔细体会其中的向量化思想,并在解决实际问题时尝试使用向量化思想进行编程,从而提高程序的运行效率。将上一步得到的量化RoI特征进一步细化为量化的空间单元(bin),也就是对每一个单元的边界进行量化。
原创
发布博客 2024.08.21 ·
470 阅读 ·
25 点赞 ·
0 评论 ·
0 收藏

PyTorch深度学习实战(24)—— 爱因斯坦操作einsum 和 einops

爱因斯坦操作凭借其便捷、直观的特点,在视觉Transformer中得到了广泛的应用,下面以Vision Transformer(ViT)在很多网络结构中,需要提取通道间或者空间像素之间的信息,从而完成通道的部分维度和空间的部分维度之间的转化。注意: 对于res1和res2,虽然它们的shape一样,但是由于提取维度时的顺序不一样,它们的数值并不相同。进行维度间的相互转化时,一定要注意维度的顺序,如果提取的顺序有误,那么无法得到正确的目标结果。除了上面介绍的爱因斯坦求和,其他的爱因斯坦操作都封装在。
原创
发布博客 2024.08.21 ·
449 阅读 ·
11 点赞 ·
0 评论 ·
0 收藏

PyTorch深度学习实战(23)—— 用高级索引实现卷积

根据卷积的定义,只需要遍历整个图像,依次获取与卷积核相乘的子块,相乘求和后就可以得到卷积的结果。卷积运算还可以从整数数组索引的角度考虑,根据卷积的计算公式,在确定了输入形状和卷积核大小后,输出的Tensor形状也就固定了。本文介绍了一些特殊的索引操作:整数数组索引与布尔数组索引,灵活的运用这些索引操作可以有效地完成数据的变形与转换。的思路,将整张图像提前转换成与卷积核相乘的子块,再把每个子块的维度展平,此时形状从。从上面的示例可以看出,通过整数数组索引完成的卷积操作,它的结果与使用。命令就能得到最终结果。
原创
发布博客 2024.08.20 ·
245 阅读 ·
8 点赞 ·
0 评论 ·
0 收藏

PyTorch深度学习实战(22)—— 高级索引

从上面的例子可以看出,整数数组索引的机制就是先将索引数组对应位置的数字,组合成源Tensor实例的索引,再根据索引值和Tensor的size、storage_offset和stride属性计算出Storage空间上的真实索引,最后返回结果。当索引数组的个数N等于Tensor的维度数tensor.ndim时,索引输出的形状等价于index的形状(index.shape),输出的每一个元素等价于。,那么直接将所有高级索引所在区域的维度转换成高级索引的维度,Tensor的其他维度按照基本索引正常计算。
原创
发布博客 2024.08.20 ·
173 阅读 ·
2 点赞 ·
0 评论 ·
0 收藏

PyTorch深度学习实战(21)—— 索引操作

4.None索引索引和切片是NumPy和PyTorch中的两种常用操作,本文将从基本索引入手帮助读者建立向量化思想。1.基本索引PyTorch中Tensor的索引和NumPy数组的索引类似,通过索引操作可以定位到数据的具体位置,也可以进行切片操作。基本索引有以下几种形式。元组序列:在索引中直接使用一个元组序列对Tensor中数据的具体位置进行定位,也可以直接使用多个整数(等价于元组序列省略括号的形式)代替。切片对象(Slice Object):在索引中常见的切片对象形如。
原创
发布博客 2024.08.19 ·
243 阅读 ·
6 点赞 ·
0 评论 ·
0 收藏

PyTorch深度学习实战(20)—— 向量化计算和广播法则

在日常编程中读者应该养成向量化的编程习惯,避免对较大的Tensor进行逐元素的遍历操作,从而提高程序的运行效率。向量化计算是指对不同的数据执行同样的一个或一批指令,或者把指令应用到一个数组或向量上,从而将多次循环操作变成一次计算。广播法则(broadcast)是科学计算中经常使用的一个技巧,它在快速执行向量化计算的同时不会占用额外的内存/显存。两个数组要么在某一个维度的尺寸一致,要么其中一个数组在该维度的尺寸为1,否则不符合广播法则的要求。会将相同的数据复制多份,因此会占用额外的空间。
原创
发布博客 2024.08.19 ·
177 阅读 ·
2 点赞 ·
0 评论 ·
0 收藏

PyTorch深度学习实战(19)—— 使用GPU加速:CUDA

幸运的是,PyTorch封装了相应的接口,可以用简单的几行代码实现分布式训练。然而,如果要保证同样的代码在不同配置的机器上均能运行,那么编写设备兼容的代码是至关重要的,本节将详细介绍如何编写设备兼容的代码。在一些实际应用场景下,代码的可移植性是十分重要的,读者可根据上述内容继续深入学习,在不同场景中灵活运用PyTorch的不同特性编写代码,以适应不同环境的工程需要。在进行低精度的计算时,可以考虑使用HalfTensor,它相比于FloatTensor可以节省一半的显存,但是需要注意数值溢出的情况。
原创
发布博客 2024.08.18 ·
95 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

PyTorch深度学习实战(18)—— 可视化工具

同时,TensorBoard是一个相对独立的工具,只要用户保存的数据遵循相应的格式,TensorBoard就能读取这些数据,进行可视化。在PyTorch 1.1.0版本之后,PyTorch已经内置了TensorBoard的相关接口,用户在手动安装TensorBoard后便可调用相关接口进行数据的可视化,TensorBoard的主界面如下图所示。Visdom十分轻量级,支持非常丰富的功能,可以胜任大多数的科学运算可视化任务,它的可视化界面如下图所示。命令将服务放至后台运行。
原创
发布博客 2024.08.18 ·
271 阅读 ·
5 点赞 ·
0 评论 ·
0 收藏

PyTorch深度学习实战(17)—— 预训练模型

中,包括经典的分类模型:VGG、ResNet、DenseNet及MobileNet等,语义分割模型:FCN及DeepLabV3等,目标检测模型:Faster RCNN以及实例分割模型:Mask RCNN等。如图所示,Mask RCNN能够分割出该图像中的部分实例,读者可考虑对预训练模型进行微调,以适应不同场景下的不同任务。注意:上述代码均在CPU上进行,速度较慢,读者可以考虑将数据与模型转移至GPU上。需要注意的是转换分为两步,第一步:构建转换操作,例如。除了加载数据,并对数据进行预处理之外,
原创
发布博客 2024.08.17 ·
114 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏
加载更多