当前位置: 首页 > news >正文

【Android】文件分块上传尝试

【Android】文件分块上传

在完成一个项目时,遇到了需要上传长视频的场景,尽管可以手动限制视频清晰度和视频的码率帧率,但仍然避免不了视频大小过大的问题,且由于服务器原因,网络不太稳定。这个时候想到了可以将文件分块。

为什么选择文件分片上传

  1. 提高上传成功率:在网络不稳定或上传大文件时,一般上传可能因网络中断而导致整个上传过程失败,需要重新开始。而分片上传是将文件分成多个小块分别上传,即使某个分片上传失败,只需重新上传该分片,而不是整个文件,大大提高了上传的成功率。
  2. 实现断点续传:分片上传可以记录每个分片的上传进度,当上传因某种原因中断后,再次启动上传时,可以从上次中断的位置继续上传未完成的分片,无需从头开始,节省了时间和带宽。
  3. 并发上传:可以将多个分片同时上传到服务器,利用多线程或并发请求技术,充分利用网络带宽,加快上传速度。特别是对于大文件,并发上传多个分片能够显著缩短上传时间。

文件MD5 摘要计算

public static String getFileMD5String(File file) {MessageDigest messageDigest = null;FileInputStream fileInputStream = null;try {// 1. 初始化 MD5 摘要器messageDigest = MessageDigest.getInstance("MD5");// 2. 打开文件输入流fileInputStream = new FileInputStream(file);byte[] buffer = new byte[8192]; // 8KB 缓冲区int length;// 3. 流式读取文件内容while ((length = fileInputStream.read(buffer)) != -1) {messageDigest.update(buffer, 0, length); // 更新哈希计算}// 4. 生成最终哈希值byte[] digest = messageDigest.digest();// 5. 转换为十六进制字符串StringBuilder sb = new StringBuilder();for (byte b : digest) {String hex = Integer.toHexString(0xFF & b); // 字节转十六进制if (hex.length() == 1) {sb.append('0'); // 补零对齐}sb.append(hex);}return sb.toString();} catch (...) {// 异常处理} finally {// 关闭流}return null;
}

1. 为什么使用 MessageDigest

  • MessageDigest 是 Java 标准库中专门用于生成哈希摘要的类。
  • 支持多种算法(MD5、SHA-1、SHA-256 等),通过 getInstance("MD5") 指定算法。

2. 为什么分块读取(8KB 缓冲区)?

  • 内存效率:直接读取整个文件到内存会导致 OOM(尤其处理大文件时)。
  • 性能平衡
    • 过小(如 1KB)→ 增加 I/O 次数,降低性能。
    • 过大(如 1MB)→ 占用更多内存,边际收益递减。

3. 流式更新的必要性

while ((length = fileInputStream.read(buffer)) != -1) {messageDigest.update(buffer, 0, length);
}
  • 逐块更新哈希状态,避免一次性处理整个文件。
  • 即使文件大小超过内存限制,仍可正常计算。

并发上传

public void sendDetectVideo(File file, String token,String fileMD5String, LoadTasksCallBack callBack) {long fileSize = file.length();int totalChunks = (int) Math.ceil(fileSize * 1.0 / CHUNK_SIZE);CountDownLatch latch = new CountDownLatch(totalChunks);Map<Integer, Future<Boolean>> futures = new HashMap<>();for (int i = 0; i < totalChunks; i++) {final int chunkIndex = i;long start = i * CHUNK_SIZE;long end = Math.min((i + 1) * CHUNK_SIZE, fileSize);Callable<Boolean> task = () -> {try {Log.d("TAG", "sendDetectVideo: " + token);return uploadChunk(file, token, start, end, chunkIndex, totalChunks, fileMD5String, callBack);} finally {latch.countDown();}};Future<Boolean> future = executorService.submit(task);futures.put(chunkIndex, future);}try {latch.await();boolean allSuccess = true;for (Future<Boolean> future : futures.values()) {if (!future.get()) {allSuccess = false;break;}}if (allSuccess) {callBack.onSuccess("所有分块上传成功");} else {callBack.onFailed("部分分块上传失败");}} catch (InterruptedException | ExecutionException e) {e.printStackTrace();callBack.onFailed("上传过程中出现异常: " + e.getMessage());} finally {executorService.shutdown();}
}

初始化参数

long fileSize = file.length();
int totalChunks = (int) Math.ceil(fileSize * 1.0 / CHUNK_SIZE);
  • 计算总分块数:根据文件大小和预设的 CHUNK_SIZE(如5MB)计算需要分成多少块。

并发控制工具

CountDownLatch latch = new CountDownLatch(totalChunks);
Map<Integer, Future<Boolean>> futures = new HashMap<>();
  • CountDownLatch:用于等待所有分块上传完成(初始值为总分块数)。
  • Future集合:保存每个分块上传任务的执行结果。

遍历所有分块

for (int i = 0; i < totalChunks; i++) {final int chunkIndex = i;long start = i * CHUNK_SIZE;long end = Math.min((i + 1) * CHUNK_SIZE, fileSize);Callable<Boolean> task = () -> {try {return uploadChunk(...); // 上传分块} finally {latch.countDown(); // 无论成功与否,计数器减1}};Future<Boolean> future = executorService.submit(task);futures.put(chunkIndex, future);
}
  • 分块范围计算:确定每个分块的起始(start)和结束(end)位置。
  • 任务定义:每个分块上传逻辑封装为 Callable 任务,上传完成后触发 latch.countDown()
  • 任务提交:将任务提交到线程池 executorService,保存返回的 Future 对象。

等待所有分块完成

try {latch.await(); // 阻塞直到所有分块完成// 检查所有任务结果boolean allSuccess = true;for (Future<Boolean> future : futures.values()) {if (!future.get()) { // 获取任务执行结果allSuccess = false;break;}}// 回调结果if (allSuccess) {callBack.onSuccess("所有分块上传成功");} else {callBack.onFailed("部分分块上传失败");}
} catch (...) {// 异常处理
} finally {executorService.shutdown(); // 关闭线程池
}
  • 阻塞等待latch.await() 确保主线程等待所有分块上传完成。
  • 结果检查:遍历所有 Future,检查每个分块是否上传成功。
  • 回调通知:根据结果调用 onSuccessonFailed
  • 资源释放:关闭线程池。

Build请求体

private boolean uploadChunk(File file, String token, long start, long end, int chunkIndex,int totalChunks, String MD5, LoadTasksCallBack callBack) {RequestParams mToken = new RequestParams();mToken.put("Authorization", "Bearer " + token);MultipartBody.Builder requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM);Log.d(TAG, "uploadChunk: " + chunkIndex + " " + totalChunks + " " + MD5);MultipartBody multipartBody = requestBody.addFormDataPart("md5", MD5).addFormDataPart("chunkIndex", String.valueOf(chunkIndex)).addFormDataPart("totalChunks", String.valueOf(totalChunks)).addFormDataPart("file", "file", createChunkRequestBody(file, chunkIndex, start, end)).build();Request request = createRequest(URL.SEND_VIDEO_FILE_URL, multipartBody, mToken, start);return executeRequest(request, callBack);
}private Request createRequest(String url, MultipartBody multipartBody, RequestParams mToken, long start) {Headers.Builder mHeadersBuilder = new Headers.Builder();for (Map.Entry<String, String> entry : mToken.urlParams.entrySet()) {mHeadersBuilder.add(entry.getKey(), entry.getValue());}Request.Builder requestBuilder = new Request.Builder().url(url).headers(mHeadersBuilder.build()).post(multipartBody);return requestBuilder.build();
}private boolean executeRequest(Request request, LoadTasksCallBack callBack) {try (Response response = client.newCall(request).execute()) {if (response.isSuccessful()) {String string = response.body().string();System.out.println("FileonResponse: " + string);callBack.onSuccess(string);return true;} else if (response.code() == 416) {// 416表示请求的Range无效,可能需要重新上传该分块System.out.println("onResponse: 分块上传失败,重新上传该分块");callBack.onFailed("分块上传失败,重新上传该分块");return false;} else {System.out.println("onResponse: 上传失败,状态码: " + response.code());callBack.onFailed("上传失败,状态码: " + response.code());return false;}} catch (IOException e) {System.out.println("onFailure: " + "上传失败");e.printStackTrace();callBack.onFailed("上传失败: " + e.getMessage());return false;}
}

分块相关

为视频文件的指定分块生成一个RequestBody对象,用于通过OkHttp将分块数据流式上传到服务器,避免一次性加载大文件到内存。

private RequestBody createChunkRequestBody(File videoFile,int chunkIndex, long start, long end) {return new RequestBody() {@Overridepublic MediaType contentType() {return MediaType.parse("video/mp4");}@Overridepublic void writeTo(BufferedSink sink) throws IOException {try (RandomAccessFile file = new RandomAccessFile(videoFile, "r");FileChannel channel = file.getChannel()) {ByteBuffer buffer = ByteBuffer.allocate(8192);long position = start;long remaining = end - start;while (remaining > 0) {int readSize = (int) Math.min(buffer.capacity(), remaining);buffer.limit(readSize);int bytesRead = channel.read(buffer, position);if (bytesRead == -1) break;sink.write(buffer.array(), 0, bytesRead);position += bytesRead;remaining -= bytesRead;buffer.clear();}}}};
}

方法签名

private RequestBody createChunkRequestBody(File videoFile,      // 要上传的视频文件int chunkIndex,      // 当前分块的索引(未直接使用)long start,          // 分块起始字节位置long end             // 分块结束字节位置
) 

匿名内部类

返回一个自定义的RequestBody对象,重写两个关键方法:

contentType() - 指定内容类型
@Override
public MediaType contentType() {return MediaType.parse("video/mp4"); // 明确告知服务器上传的是MP4视频
}
writeTo(BufferedSink sink) - 数据写入逻辑
@Override
public void writeTo(BufferedSink sink) throws IOException {try (RandomAccessFile file = new RandomAccessFile(videoFile, "r"); // 只读模式打开文件FileChannel channel = file.getChannel()                       // 获取NIO文件通道) {ByteBuffer buffer = ByteBuffer.allocate(8192); // 分配8KB缓冲区long position = start;    // 当前读取位置long remaining = end - start; // 剩余需读取的字节数while (remaining > 0) {// 确定本次读取的字节数int readSize = (int) Math.min(buffer.capacity(), remaining);buffer.limit(readSize); // 设置缓冲区读取上限// 从文件指定位置读取数据到缓冲区int bytesRead = channel.read(buffer, position);if (bytesRead == -1) break; // 文件已读完// 将缓冲区数据写入网络流sink.write(buffer.array(), 0, bytesRead);// 更新位置和剩余字节数position += bytesRead;remaining -= bytesRead;buffer.clear(); // 重置缓冲区供下次使用}}
}

流程示意

+----------------+         +----------------+         +----------------+
|   视频文件      |         |   ByteBuffer    |         |  OkHttp请求流   |
| (分块范围:      | ---->   | (8KB缓冲区)     | ---->   | (BufferedSink)  |
|  start - end)  |         +----------------+         +----------------+
+----------------+| 每次定位到| 新的position+-----------------+

相关文章:

【Android】文件分块上传尝试

【Android】文件分块上传 在完成一个项目时&#xff0c;遇到了需要上传长视频的场景&#xff0c;尽管可以手动限制视频清晰度和视频的码率帧率&#xff0c;但仍然避免不了视频大小过大的问题&#xff0c;且由于服务器原因&#xff0c;网络不太稳定。这个时候想到了可以将文件分…...

大模型中的三角位置编码实现

Transformer中嵌入表示 位置编码的实现 import torch import math from torch import nn# 词嵌入位置编码实现 class EmbeddingWithPosition(nn.Module):"""vocab_size:词表大小emb_size: 词向量维度seq_max_len: 句子最大长度 (人为设定&#xff0c;例如GPT2…...

深入详解人工智能数学基础——微积分中的自动微分及其在PyTorch中的实现原理

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…...

【Linux学习笔记】系统文件IO之重定向原理分析

【Linux学习笔记】系统文件IO之重定向原理分析 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;Linux学习笔记 文章目录 【Linux学习笔记】系统文件IO之重定向原理分析前言一. 系统文件I/01.1 一种传递标志位的方法1.2 hello.c写文件:1.3 he…...

《React Native与Flutter:社交应用中用户行为分析与埋点统计的深度剖析》

React Native与Flutter作为两款备受瞩目的跨平台开发框架&#xff0c;正深刻地影响着应用的构建方式。当聚焦于用户行为分析与埋点统计时&#xff0c;它们各自展现出独特的策略与工具选择&#xff0c;这些差异和共性不仅关乎开发效率&#xff0c;更与社交应用能否精准把握用户需…...

Cesium高度参考系统

🌍 Cesium高度参考系统趣味探索 🚀 高度参考系统形象比喻 想象一下,你正在玩一个积木游戏: CLAMP_TO_GROUND:积木被"强力胶水"粘在桌面上,无论桌面高低起伏如何 RELATIVE_TO_GROUND:积木放在"微型支架"上,始终保持离桌面固定距离 NONE:积木漂…...

海纳思(Hi3798MV300)机顶盒遇到海思摄像头

海纳思机顶盒遇到海思摄像头&#xff0c;正好家里有个海思Hi3516的摄像头模组开发板&#xff0c;结合机顶盒来做个录像。 准备工作 海纳斯机顶盒摄像机模组两根网线、两个电源、路由器一块64G固态硬盘 摄像机模组和机顶盒都接入路由器的LAN口&#xff0c;确保网络正常通信。 …...

[python] 类

一 介绍 具有相同属性和行为的事物的通称,是一个抽象的概念 三要素: 类名,属性&#xff0c;方法 格式: class 类名: 代码块 class Pepole:name "stitchcool"def getname(self):return self.name 1.1 创建对象(实例化) 格式: 对象名 类名() p1 Pepole()…...

Python中的事件循环是什么?事件是怎么个事件?循环是怎么个循环

在Python异步编程中&#xff0c;事件循环&#xff08;Event Loop&#xff09;是核心机制&#xff0c;它通过单线程实现高效的任务调度和I/O并发处理。本文将从事件的定义、循环的运行逻辑以及具体实现原理三个维度展开分析。 一、事件循环的本质&#xff1a;协程与任务的调度器…...

单片机-STM32部分:11、ADC

飞书文档https://x509p6c8to.feishu.cn/wiki/OclUwlkifiRKR2k6iLbczn5tn8g STM32的ADC是一种逐次逼近型模拟数字转换器。 是用于将模拟形式的连续信号转换为数字形式的离散信号的一类设备。 逐次逼近型ADC的原理图下&#xff1a; STM32f103系列有3个ADC&#xff0c;精度为12…...

【含文档+PPT+源码】基于微信小程序的社区便民防诈宣传系统设计与实现

项目介绍 本课程演示的是一款基于微信小程序的社区便民防诈宣传系统设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套…...

Laravel 安全:批量赋值 fillable 与 guarded

Laravel 的模型中有两个 protected 字段 fillable 与 guarded&#xff0c;注意&#xff1a;必须是 protected 以上开放程度。 我们经常通过提交表单进行数据的增删改&#xff0c;为了方便的进行数据批量修改操作 Laravel 提供了批量赋值机制&#xff1a; 假如我们想要在数据库…...

[杂谈随感-13]: 人的睡眠,如何布置床的位置比较有安全?感?

睡眠环境中的床位布置直接影响心理安全感与睡眠质量&#xff0c;需从空间防御性、人体感知机制及环境心理学多维度综合设计。 以下基于科学原理与实践案例&#xff0c;系统解析床位布置的核心策略&#xff1a; 一、空间防御性布局&#xff1a;构建心理安全边界 背靠实体墙&a…...

协议路由与路由协议

协议路由”和“路由协议”听起来相似&#xff0c;但其实是两个完全不同的网络概念。下面我来分别解释&#xff1a; 一、协议路由&#xff08;Policy-Based Routing&#xff0c;PBR&#xff09; ✅ 定义&#xff1a; 协议路由是指 根据预设策略&#xff08;策略路由&#xff0…...

内网穿透系列三:开源本地服务公网映射工具 tunnelmole

以下是对 tunnelmole 简要介绍&#xff1a; tunnelmole 是一款开源的内网穿透工具&#xff0c;一行命令就能把本地http服务映射成公网可访问的链接提供公共免费的网络服务&#xff0c;直接下载运行命令即可使用&#xff0c;也支持自行配置搭建私有客户端、服务端参考开源地址&…...

发行基础:本地化BUG导致审核失败

1、早上收到邮件&#xff0c;Steam客服说本地化功能找不到&#xff0c;无法切换多国语言&#xff0c;所以正式版V1.0程序未通过。 大脑瞬间有要爆炸的感觉&#xff0c;测试后发现V1以及demo都存在同样问题。 属于重大BUG&#xff0c;需要立即解决&#xff0c;最高优先级。 2、…...

QB/T 1649-2024 聚苯乙烯泡沫塑料包装材料检测

聚苯乙烯泡沫塑料包装材料是指以可发行聚苯乙烯珠粒为原料&#xff0c;经加热预发泡后在模具中加热成型而制得&#xff0c;具有闭孔结构的聚苯乙烯泡沫塑料包装材料。 QB/T 1649-2024聚苯乙烯泡沫塑料包装材料检测项目&#xff1a; 测试项目 测试标准 外观 QB/T 1649 气味…...

【Day 24】HarmonyOS端云一体化开发:云函数

一、端云开发核心架构 1. 技术栈对比 维度传统开发模式HarmonyOS端云一体化方案优势 开发工具需独立配置前后端环境DevEco Studio统一开发端云代码降低60%环境搭建时间部署流程手动部署服务器与数据库一键部署至AGC Serverless免运维&#xff0c;自动弹性伸缩通信安全需自行实…...

大模型(LLMs)强化学习——RLHF及其变种

大模型&#xff08;LLMs&#xff09;强化学习——RLHF及其变种面 一、介绍一下 LLM的经典预训练Pipeline&#xff1f;二、预训练&#xff08;Pre-training&#xff09;篇 具体介绍一下 预训练&#xff08;Pre-training&#xff09;&#xff1f;三、有监督微调&#xff08;Sup…...

20250510解决NanoPi NEO core开发板在Ubuntu core22.04.3系统下适配移远的4G模块EC200A-CN的问题

1、h3-eflasher-friendlycore-jammy-4.14-armhf-20250402.img.gz 在WIN10下使用7-ZIP解压缩/ubuntu20.04下使用tar 2、Win32DiskImager.exe 写如32GB的TF卡。【以管理员身份运行】 3、TF卡如果已经做过会有3个磁盘分区&#xff0c;可以使用SD Card Formatter/SDCardFormatterv5…...

WinCC V7.2到V8.0与S71200/1500系列连接通讯教程以及避坑点

声明&#xff1a;WinCC与PLC连接详细指导与注意避坑点&#xff0c;部分图片和描述来源于网络&#xff0c;如有冒犯&#xff0c;请联系本人删除。 1.环境介绍 自WinCC V7.2版本起&#xff0c;软件新增加了 "SIMATIC S7-1200, S7-1500 Channel"通道,用于WinCC与 S7-1…...

WPF 性能 UI 虚拟化 软件开发人员的思考

UI 虚拟化是 WPF 采用的一项技术&#xff0c;框架会仅创建用户可见的 UI 元素。例如&#xff0c;如果 ListView 中有 1000 个文本块控件&#xff0c;但您只能查看其中的 10 个&#xff0c;那么 VisualTree 中也只会显示 10 个文本块。向下滚动时&#xff0c;不再可见的元素将被…...

服务器综合实验(实战详解)

该文章的目录部分 实验内容 实验完成步骤 虚拟机准备 配置两个虚拟机的本地仓库 虚拟机A&#xff1a; 虚拟机B&#xff1a; 配置SSH公钥互信 虚拟机A&#xff1a; ​编辑 虚拟机B&#xff1a; 提供基于bind的DNS服务 虚拟机A&#xff1a; 项目需求1&#xff1a; …...

【动态导通电阻】软硬开关下GaN器件的动态RDSON

2019年,浙江大学的Rui Li、Xinke Wu等人基于双脉冲和多脉冲测试方法,研究了在硬开关和软开关条件下商用氮化镓(GaN)功率器件的动态导通电阻(R DSON )特性。实验结果表明,不同GaN器件在硬开关和软开关条件下的动态R DSON 表现出不同的行为,这些行为受关断电压和频率的影…...

Java基础 5.10

1.方法重写课堂练习 package com.logic.override_; //编写一个Person类 包括属性/private(name, age) 构造器 方法say(返回自我介绍的字符串) //编写一个Student类 继承Person类 增加id score 属性/private 以及构造器 //定义say方法(返回自我介绍的信息) //在main中 分别创建…...

通信原理绪论

&#xff08;I&#xff09;信息量&#xff1a;第j条消息中包含的信息定义为&#xff1a;I(j) 消息是信息的表现形式 消息是信息的一种抽象和本质内容 消息中所含的信息量是该消息出现概率的函数&#xff0c;即 I I[P(x)] P&#xff08;x&#xff09;越小&#xff0c;I越…...

Maven 插件配置分层架构深度解析

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

jMeter压测环境部署JDK+Groovy+JMeter+Proto+IntelliJ IDEA

为确保 Groovy、JDK 和 JMeter 三者的版本兼容性&#xff0c;需遵循以下核心原则和步骤&#xff1a; 一、版本兼容性对照表 组件推荐版本范围关键兼容规则JDKJava 8/11/17 (LTS)- JMeter 5.6 支持 Java 11/17GroovyGroovy 3.0.7 或 4.0- Groovy 3.x 支持 Java 8-17 - Groovy 4…...

c#建筑行业财务流水账系统软件可上传记账凭证财务管理系统签核功能

# financial_建筑行业 建筑行业财务流水账系统软件可上传记账凭证财务管理系统签核功能 # 开发背景 软件是给岳阳客户定制开发一款建筑行业流水账财务软件。提供工程签证单、施工日志、人员出勤表等信息记录。 # 财务管理系统功能描述 1.可以自行设置记账科目&#xff0c;做凭…...

深度解析 MySQL 与 Spring Boot 长耗时进程:从故障现象到根治方案(含 Tomcat 重启必要性分析)

一、典型故障现象与用户痛点 在高并发业务场景中&#xff0c;企业级 Spring Boot 应用常遇到以下连锁故障&#xff1a; 用户侧&#xff1a;网页访问超时、提交表单无响应&#xff0c;报错 “服务不可用”。运维侧&#xff1a;监控平台报警 “数据库连接池耗尽”&#xff0c;To…...

一种运动平台扫描雷达超分辨成像视场选择方法——论文阅读

一种运动平台扫描雷达超分辨成像视场选择方法 1. 专利的研究目标与意义1.1 研究目标1.2 实际意义2. 专利的创新方法与技术细节2.1 核心思路与流程2.1.1 方法流程图2.2 关键公式与模型2.2.1 回波卷积模型2.2.2 最大后验概率(MAP)估计2.2.3 统计约束模型2.2.4 迭代优化公式2.3 …...

【程序员AI入门:开发】11.从零构建智能问答引擎:LangChain + RAG 实战手册

1、技术选型 组件推荐方案说明文本嵌入模型sentence-transformers/all-MiniLM-L6-v2轻量级且效果较好的开源模型向量数据库FAISS高效的本地向量检索库大语言模型GPT-3.5/开源LLM&#xff08;如ChatGLM3&#xff09;根据资源选择云端或本地模型文档处理框架LangChain简化RAG流程…...

《深入理解Linux网络》笔记

《深入理解Linux网络》笔记 前言参考 前言 前段时间看了《深入理解Linux网络》这本书&#xff0c;虽然有些地方有以代码充篇幅的嫌疑&#xff0c;但总体来说还是值得一看的。在这里简单记录一下笔记&#xff0c;记录下对网络新的理解。 内核是如果接受网络包的&#xff1f; 如…...

【计算机视觉】优化MVSNet可微分代价体以提高深度估计精度的关键技术

优化MVSNet可微分代价体以提高深度估计精度的关键技术 1. 代价体基础理论与分析1.1 标准代价体构建1.2 关键问题诊断 2. 特征表示优化2.1 多尺度特征融合2.2 注意力增强匹配 3. 代价体构建优化3.1 自适应深度假设采样3.2 可微分聚合操作改进 4. 正则化与优化策略4.1 多尺度代价…...

致远A8V5-9.0安装包(包含信创版)【附百度网盘链接】

A8适用于中大型企业&#xff0c;基于"以人为中心"的产品理念&#xff0c;致力于为企业构建和完善“数字智能”的协同运营体系&#xff0c;以组织模型为基础&#xff0c;连接各项工作和业务&#xff0c;聚合信息、资源和能力&#xff0c;实现组织内和跨组织的高效协同…...

terminal 共享工具ttyd

ttyd 是一个非常轻量的工具&#xff0c;它可以将你的终端&#xff08;如 bash&#xff09;通过 Web 页面共享出去&#xff0c;适合教学、演示、远程协作等场景&#xff0c;而且 支持 macOS、ARM64、Linux 等平台。 ⸻ ✅ 一、ttyd 简介 • 将 shell 包装成 WebSocket 服务&am…...

右值引用的剖析

引入&#xff1a;为什么要有右值引用&#xff1f; 右值引用的存在&#xff0c;就是为了解决左值引用解决不了的问题&#xff01; 左值引用的问题&#xff1a; 我们知道&#xff0c;左值引用在做参数和做返回值都可以提高效率&#xff1b;但是有时候&#xff0c;我们无法用左…...

MIT XV6 - 1.4 Lab: Xv6 and Unix utilities - find

接上文 MIT XV6 - 1.3 Lab: Xv6 and Unix utilities - primes find 继续实验&#xff0c;实验介绍和要求如下 (原文链接 译文链接) : Write a simple version of the UNIX find program for xv6: find all the files in a directory tree with a specific name. Your solution…...

PyTorch API 8 - 工具集、onnx、option、复数、DDP、量化、分布式 RPC、NeMo

文章目录 torch.nn.inittorch.nn.attention工具集子模块 torch.onnx概述基于 TorchDynamo 的 ONNX 导出器基于TorchScript的ONNX导出器贡献与开发 torch.optim如何使用优化器构建优化器每个参数的选项执行优化步骤optimizer.step()optimizer.step(closure) 基类算法如何调整学习…...

解决使用宝塔Linux部署前后端分离项目遇到的问题

问题一&#xff1a;访问域名转圈圈&#xff0c;显示404,403 没有解决跨域问题&#xff0c;在后端yml中设置content&#xff1a;/prod&#xff08;生产环境&#xff09;&#xff0c;在前端.env文件中将http&#xff1a;//127.0.0.1:8080/替换为公网IP&#xff0c;并在vite.conf…...

力扣top100 矩阵置零

开辟数组来标记元素为0的行和列&#xff0c;然后将对应的行和列的元素全部置为0&#xff1b; class Solution { public:void setZeroes(vector<vector<int>>& matrix) {int n matrix.size();int m matrix[0].size();vector<int> l(m),r(n);for(int i …...

JavaScript基础-作用域概述

在学习JavaScript的过程中&#xff0c;理解其作用域&#xff08;Scope&#xff09;机制是至关重要的。它不仅影响变量的生命周期和可见性&#xff0c;还决定了代码执行期间如何查找变量值。本文将深入探讨JavaScript的作用域概念&#xff0c;包括全局作用域、函数作用域、块级作…...

【经验总结】Ubuntu 22.04.5 LTS 将内核从5.15.0-140 升级到6.8.0-60后纽曼无线网卡无法使用解决措施

【经验总结】Ubuntu 22.04.5 LTS 将内核从5.15.0-140 升级到6.8.0-60后纽曼无线网卡无法使用解决措施 问题现象定位过程问题根因解决方案将内核内核从6.8.0-60 降级到5.15.0-140。1、回滚内核版本2、解决重启系统&#xff0c;找不到选择内核版本的菜单问题3、将新版本的kernel卸…...

MQTT协议介绍

一、MQTT定义 MQTT(Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输)是 IBM 开发的一个即时通讯协议&#xff0c;有可能成为物联网的重要组成部分。 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的消息传输协议&#xff…...

jetson orin nano super AI模型部署之路(五)tensorrt C++ api介绍

我们基于tensorrt-cpp-api这个仓库介绍。这个仓库的代码是一个非常不错的tensorrt的cpp api实现&#xff0c;可基于此开发自己的项目。 我们从src/main.cpp开始按顺序说明。 一、首先是声明我们创建tensorrt model的参数。 // Specify our GPU inference configuration optio…...

excel函数操作案例

需求分析1&#xff1a;学习时间与最终成绩之间的关系 问题&#xff1a;学习时间的长短是否对学生的最终成绩有显著影响&#xff1f; 操作步骤&#xff1a;选择"study_hours"和"final_grade"列完整数据&#xff0c;选择散点图 单击B&#xff0c;按住ctrl键…...

各种音频产品及场景总结

本文记录和总结各种音频产品以及音频场景&#xff0c;比如音箱、耳机、对讲机、录音笔、助听器、声卡等等。 蓝牙耳机 蓝牙耳机现在已经很普及了&#xff0c;主要功能就是连着手机等设备然后播放音频&#xff0c;所以&#xff0c;肯定要有扬声器模块&#xff1b;然后还可以接打…...

Java后端开发day46--多线程(二)

&#xff08;以下内容全部来自上述课程&#xff09; 多线程 1. Lock锁 虽然我们可以理解同步代码块和同步方法的锁对象问题&#xff0c; 但是我们并没有直接看到在哪里加上了锁&#xff0c;在哪里释放了锁&#xff0c; 为了更清晰的表达如何加锁和释放锁&#xff0c;JDK5以…...

U盘制作系统盘(含U盘恢复)

✅ 准备工作 1. 一个至少 8GB 容量的 U 盘 注意&#xff1a;U 盘将被格式化&#xff0c;请提前备份数据。 2. 一台可以联网的 Windows 电脑 &#x1f4e5; 下载官方制作工具&#xff08;推荐&#xff09; 1. 打开微软官网下载页面&#xff1a; &#x1f449; Windows 11 下载…...

如何阅读、学习 Linux 2 内核源代码 ?

学习Linux 2内核源代码是深入理解操作系统工作原理的绝佳途径&#xff0c;但这无疑是一项极具挑战性的任务。下面为你提供一套系统的学习方法和建议&#xff1a; 一、扎实基础知识 操作系统原理 透彻掌握进程管理、内存管理、文件系统、设备驱动等核心概念。推荐阅读《操作系…...