1.PyTorch - DataLoader 源码解析(一)
2.库博软件源代码静态分析工具(英文简称CoBOT SAST)介绍
3.HTTP连接池及源码分析(一)
4.「Android技术汇」Retrofit2 源码解析和案例说明
5.FindBugs源码分析工具使用指南
6.别再说代码质量难评估了!线分析源SonarQube一键分析代码质量他不香吗?
PyTorch - DataLoader 源码解析(一)
本文为作者基于个人经验进行的初步解析,由于能力有限,分析可能存在遗漏或错误,源码敬请各位批评指正。线分析源
本文并未全面解析 DataLoader 的码线个人主页源码模板全部源码,仅对 DataLoader 与 Sampler 之间的分析联系进行了分析。以下内容均基于单线程迭代器代码展开,源码多线程情况将在后续文章中阐述。线分析源
以一个简单的码线数据集遍历代码为例,在循环中,分析数据是源码如何从 loader 中被取出的?通过断点调试,我们发现循环时,线分析源代码进入了 torch.utils.data.DataLoader 类的码线 __iter__() 方法,具体内容如下:
可以看到,分析该函数返回了一个迭代器,主要由 self._get_iterator() 和 self._iterator._reset(self) 提供。接下来,我们进入 self._get_iterator() 方法查看迭代器的产生过程。
在此方法中,根据 self.num_workers 的数量返回了不同的迭代器,主要区别在于多线程处理方式不同,但这两种迭代器都是继承自 _BaseDataLoaderIter 类。这里我们先看单线程下的例子,进入 _SingleProcessDataLoaderIter(self)。
构造函数并不复杂,在父类的构造器中执行了大量初始化属性,然后在自己的前端定位源码构造器中获得了一个 self._dataset_fetcher。此时继续单步前进断点,发现程序进入到了父类的 __next__() 方法中。
在分析代码之前,我们先整理一下目前得到的信息:
下面是 __next__() 方法的内容:
可以看到最后返回的是变量 data,而 data 是由 self._next_data() 生成的,进入这个方法,我们发现这个方法由子类负责实现。
在这个方法中,我们可以看到数据从 self._dataset_fecther.fetch() 中得到,需要依赖参数 index,而这个 index 由 self._next_index() 提供。进入这个方法可以发现它是由父类实现的。
而前面的 index 实际上是由这个 self._sampler_iter 迭代器提供的。查找 self._sampler_iter 的定义,我们发现其在构造函数中。
仔细观察,我们可以在倒数第 4 行发现 self._sampler_iter = iter(self._index_sampler),这个迭代器就是这里的 self._index_sampler 提供的,而 self._index_sampler 来自 loader._index_sampler。这个 loader 就是最外层的 DataLoader。因此我们回到 DataLoader 类中查看这个 _index_sampler 是如何得到的。
我们可以发现 _index_sampler 是一个由 @property 装饰得到的属性,会根据 self._auto_collation 来返回 self.batch_sampler 或者 self.sampler。再次整理已知信息,我们可以得到:
因此,只要知道 batch_sampler 和 sampler 如何返回 index,就能了解整个流程。短剧频源码
首先发现这两个属性来自 DataLoader 的构造函数,因此下面先分析构造函数。
由于构造函数代码量较大,因此这里只关注与 Sampler 相关的部分,代码如下:
在这里我们只关注以下部分:
代码首先检查了参数的合法性,然后进行了一轮初始化属性,接着判断了 dataset 的类型,处理完特殊情况。接下来,函数对参数冲突进行了判断,共判断了 3 种参数冲突:
检查完参数冲突后,函数开始创建 sampler 和 batch_sampler,如下图所示:
注意,仅当未指定 sampler 时才会创建 sampler;同理,仅在未指定 batch_sampler 且存在 batch_size 时才会创建 batch_sampler。
在 DataLoader 的构造函数中,如果不指定参数 batch_sampler,则默认创建 BatchSampler 对象。该对象需要一个 Sampler 对象作为参数参与构造。这也是在构造函数中,batch_sampler 与 sampler 冲突的原因之一。因为传入一个 batch_sampler 时,说明 sampler 已经作为参数完成了 batch_sampler 的构造,若再将 sampler 传入 DataLoader 是多余的。
以第一节中的简单代码为例,此时并未指定 Sampler 和 batch_sampler,也未指定 batch_size,权益优选源码默认为 1,因此在 DataLoader 构造时,创建了一个 SequencialSampler,并传入了 BatchSampler 进行构建。继续第一节中的断点,可以发现:
具体使用 sampler 还是 batch_sampler 来生成 index,取决于 _auto_collation,而从上面的代码发现,只要存在 self.batch_sampler 就永远使用 batch_sampler 来生成。batch_sampler 与 sampler 冲突的原因之二:若不设置冲突,那么使用者试图同时指定 batch_sampler 与 sampler 后,尤其是在使用者继承了新的 Sampler 子类后, sampler 在获取数据的时候完全没有被使用,这对开发者来说是一个困惑的现象,容易引起不易察觉的 BUG。
继续断点发现程序进入了 BatchSampler 的 __iter__() 方法,代码如下:
从代码中可以发现,程序不停地从 self.sampler 中获取 idx 加入列表,直到填满一个 batch 的量,并将这一整个 batch 的 index 返回到迭代器的 _next_data()。
此处由 self._dataset_fetcher.fetch(index) 来获取真正的数据,进入函数后看到:
这里依然根据 self.auto_collation(来自 DataLoader._auto_collation)进行分别处理,但是总体逻辑都是通过 self.dataset[] 来调用 Dataset 对象的 __getitem__() 方法。
此处的 Dataset 是来自 torchvision 的 DatasetFolder 对象,这里读取文件路径中的后,经过转换变为 Tensor 对象,与标签 target 一起返回。网上源码网参数中的 index 是由迭代器的 self._dataset_fetcher.fetch() 传入。
整个获取数据的流程可以用以下流程图简略表示:
注意:
另附:
对于一条循环语句,在执行过程中发生了以下事件:
库博软件源代码静态分析工具(英文简称CoBOT SAST)介绍
库博软件源代码静态分析工具(CoBOT SAST)在软件开发和质量保障中扮演着关键角色。与动态测试和传统手段相比,静态分析能更系统高效地剖析代码结构,通过白盒分析方式,显著减少漏报风险。研究表明,早期发现和修复缺陷成本远低于后期,因此,越来越多的企业采用CoBOT SAST进行源代码检测,确保符合IEC、DO-B/C等工业和安全标准。
CoBOT SAST集成了多种国际先进技术和深度学习,针对多种主流编程语言提供全面的缺陷检测,包括边界条件漏洞、SQL注入等类问题。它与Git、SVN等源代码管理系统无缝对接,并支持缺陷管理与持续集成工具,实现了编码规则检查、安全漏洞检测等功能。此外,工具还支持自定义开发接口,允许用户针对特定行业或内部编码标准进行定制,弥补了市场上的普遍不足。
该工具的优势在于其精确的缺陷检测能力,兼容多种国际和国内标准,无需搭建完整运行环境,能在片段代码中直接分析。国内研发,自主可控,且提供SDK接口和可视化视图,支持国产化环境,服务响应迅速,定制灵活。总体来看,CoBOT SAST作为一款全面且适应性强的源代码静态分析工具,能显著提升软件开发过程中的质量和安全性。
HTTP连接池及源码分析(一)
HTTP连接池是一个管理与复用HTTP连接的高效技术,它旨在提高HTTP请求的性能与效率。尤其在高并发场景中,传统每次请求建立新TCP连接并关闭,这种操作可能引起性能瓶颈。连接池通过预先创建并复用一定数量的连接,有效管理资源,避免了因等待连接而造成的性能下降。
构建HTTP连接池的核心在于提升并发场景下的系统性能。当一个连接被占用,其他客户端线程需要等待,因此复用已有的连接成为关键。HTTP连接池通过维护目标主机与端口号跟踪连接复用情况,当找到可复用连接时,将请求发送至该连接,避免了创建新连接。连接池策略考虑安全性、空闲时间等因素,确保高效复用。
使用HTTP连接池时,首先在Maven仓库选择合适的...即可查看。通过HTML报告,用户可以在“List bugs by bug category”页签下按类别查看bug,展开任一bug,可了解其类别、所属类及其属性或方法、代码文件名与行数。对于不清楚bug原因的情况,可查阅描述页面获取详细解释。
对于项目中包含多个jar包的情况,本文推荐使用rejarForAnalysis脚本。该脚本位于FindBugs工具的bin目录下,Linux环境下运行需赋予可执行权限。rejarForAnalysis脚本用于整合多个jar包,形成一个大型的analyze.jar包。结合shell命令,可自动在当前目录及子目录下查找所有jar包,并生成整合包,随后,分析过程与常规FindBugs执行方式相同。
通过本文介绍,用户应能熟练掌握FindBugs的基本使用方法,并解决项目中遇到的常见问题。参考文献提供进一步学习资源。
别再说代码质量难评估了!SonarQube一键分析代码质量他不香吗?
代码质量的重要性无需赘言,SonarQube作为一款强大的工具,正日益受到关注。这款开源平台通过插件形式支持多种编程语言,全面检测代码中的潜在问题,极大地简化了代码质量管理工作。本文将带你通过实例,了解如何利用SonarQube进行代码质量管理。SonarQube的组成部分
SonarQube是Sonar的服务器端,负责在线分析和展示。Sonar Scanner则是用于源码扫描的工具,它会将扫描结果存储到数据库,方便SonarQube进一步分析。环境配置
SonarQube需要JDK及以上版本,配置完成后,通过java -version检查,确保环境正确。Maven的安装和配置同样重要,确保mvn -version运行无误。数据库支持
SonarQube支持多种数据库,如SQLServer、Oracle和H2,但不包括MySQL。默认使用H2内存数据库,查看数据时可能不太方便。安装与启动
从SonarQube官网下载社区版,启动时,选择对应系统目录,如Windows用户启动macosx-universal-,运行sonar.sh start。SonarQube启动成功后,访问.0.0.1:管理后台,更改默认密码后,即可开始使用。代码扫描
以一个简单项目为例,导入项目、设置信息后,创建Token并配置Maven构建,运行Sonar Scanner命令。扫描完成后,SonarQube会显示项目数据。多模块项目扫描
对于多模块项目,需先运行mvn install,然后针对每个模块运行Sonar Scanner分析命令。成功后,SonarQube管理后台会新增相应项目。 无论构建工具是Maven、Gradle还是Ant,Sonar Scanner都能无缝对接,只需查阅官方文档即可进行配置。如何查看源代码
要查看网页或软件的源代码,可以通过以下方法:
1. 在浏览器中查看网页源代码:在大多数现代浏览器中,都提供了查看网页源代码的功能。可以使用快捷键Ctrl+U(在Windows系统中)或Command+Option+U(在Mac系统中)来打开网页的源代码视图。也可以通过右键点击页面上的任何位置,然后选择“查看页面源代码”或类似选项来打开源代码视图。
2. 使用开发者工具查看源代码:现代浏览器提供了开发者工具,可以在其中查看网页的源代码,并进行调试和分析。可以通过按F键或在菜单中选择“开发者工具”来打开开发者工具。在开发者工具中,有一个名为“Elements”(或类似名称)的选项卡,点击该选项卡可以查看网页的HTML和CSS源代码。
3. 查看软件代码:对于桌面软件或移动应用程序,通常需要使用专门的开发工具来查看源代码。以Java语言编写的软件,可以使用Eclipse或IntelliJ IDEA等集成开发环境(IDE)打开项目并查看代码。对于C/C++语言,可以使用Visual Studio等IDE。移动应用程序的源代码通常存储在项目文件夹中,可以使用相应的开发工具或文本编辑器打开查看。
请注意,在查看和分析源代码时,要遵守相关法律和道德规范,尊重他人的知识产权和隐私权。