系统设计——大文件传输方案设计

摘要

大文件传输是指通过网络将体积较大的文件从一个位置发送到另一个位置的过程。这些文件可能包括高清视频、大型数据库、复杂的软件安装包等,它们的大小通常超过几百兆字节(MB)甚至达到几个吉字节(GB)或更大。大文件传输可能面临一些挑战,比如传输速度慢、网络不稳定导致的传输中断、以及存储空间的限制等。为了有效地传输大文件,可能需要使用特定的技术,比如压缩文件以减少传输数据量、使用高速网络连接、或者采用分块传输技术来提高传输的稳定性和效率。

1. 什么是大文件传输

大文件的定义取决于具体的应用场景、传输技术和硬件资源。通常情况下,大文件的定义与以下几个因素相关:

1.1. 大文件常见定义

网络传输中

  • >10MB:对低速网络(如移动网络或不稳定的无线连接)来说,10MB及以上的文件可能需要优化。
  • >100MB:在普通网络环境中,100MB以上的文件一般被认为是大文件,需要特殊优化,如分块或流式传输。
  • >1GB:在高速网络环境中,1GB及以上的文件通常被认为是大文件,传输时需要额外注意内存、带宽和传输错误恢复。

存储或操作中

  • >100MB:对于低配置设备(如嵌入式设备或老旧服务器),内存无法一次加载,文件需要分块处理。
  • >1GB:在文件处理场景中,1GB及以上的文件可能会对 I/O 性能或存储速度造成显著影响。

1.2. 从技术视角分析

大文件的判断标准与以下技术限制相关:

网络传输协议限制

  • HTTP:对于普通 HTTP 上传,传输 >100MB 文件可能会遇到超时问题,需要优化(如分片上传或断点续传)。
  • Socket:理论上无文件大小限制,但需要注意缓冲区大小设置和断点续传。
  • gRPC:默认单个消息限制为 4MB,可以通过配置增加限制,但传输大文件时推荐使用流式传输。

硬件和系统限制

  • 内存:如果文件无法一次性加载到内存中(如文件大小 > 系统内存的 50%),需要分块处理。
  • 文件系统:某些文件系统对单个文件大小有上限。例如,FAT32 的最大文件大小是 4GB。
  • 用户体验:对用户来说:传输文件超过 30秒 就可能被认为是“较大”文件。超过 1分钟 需要提供进度条或断点续传功能。

1.3. 实际场景中的大文件划分参考

文件大小

定义

应对策略

<10MB

小文件

一次性传输即可,无需特别优化。

10MB-100MB

中等大小文件

使用分块传输或流式传输。

100MB-1GB

大文件

必须分块,建议使用断点续传、校验完整性等优化手段。

>1GB

超大文件

分块、多线程传输,尽量使用高效协议(如 gRPC 或专用大文件传输工具)。

>10GB

超级大文件(少见)

考虑带外传输(如 FTP、SFTP)或直接通过硬盘快递等方式完成传输。

1.4. 判断是否为大文件条件参考

  1. 内存不足:如果程序无法一次性加载文件到内存,或者引发内存溢出错误(OutOfMemoryError)。
  2. 传输时间过长:文件传输时间明显超出用户期望(如 10 秒以上)。
  3. I/O 性能瓶颈:文件操作导致磁盘或网络 I/O 压力显著增加。
  4. 网络不稳定:传输过程频繁中断或出现丢包。

1.5. 针对大文件的优化技术参选

  1. 分块传输:将文件分为小块逐步传输。
  2. 断点续传:网络中断时无需重新传输已完成部分。
  3. 压缩传输:减少文件大小,加快传输速度。
  4. 流式传输:在文件读取和写入时流式处理,避免一次性加载到内存。
  5. 多线程并行传输:提高传输效率。
  6. 分片存储(Shard):对于超大文件,考虑存储时按逻辑拆分。

2. 大文件传输有什么挑战

大文件传输的挑战和问题主要来自于文件的体积、传输过程中的网络和硬件限制。以下是详细分析,以及常见问题和对应的解决方案。

2.1. 网络限制

  • 传输速度:文件越大,传输时间越长,尤其在低带宽或高延迟网络中表现明显。
  • 网络中断:大文件传输过程中,网络的不稳定(如超时、丢包)可能导致传输失败,需要重新开始。
  • 带宽占用:大文件传输可能占用大量带宽,影响其他任务的正常运行。
  • 跨网络传输:不同的网络环境(如企业内网与公网)可能有防火墙、代理或限速限制。

2.2. 系统与硬件限制

  • 内存不足:如果需要将大文件加载到内存中处理,可能导致内存溢出(OutOfMemoryError)。
  • 磁盘性能:大文件的读写操作对磁盘 I/O 是一个挑战,尤其是在磁盘性能较差或并发读写多的情况下。
  • 文件系统限制:某些文件系统对单个文件大小有上限(如 FAT32 的单文件大小限制为 4GB)。磁盘空间不足可能导致文件传输失败。

2.3. 数据完整性

  • 文件损坏:网络传输中的数据丢失或错误可能导致接收端文件不完整或损坏。
  • 校验困难:大文件的完整性校验(如 MD5、SHA-256)耗时较长。

2.4. 并发与多用户冲突

  • 多用户竞争资源:多个用户同时上传或下载大文件时,可能导致服务器资源不足(CPU、内存、I/O 等)。
  • 锁机制:大文件传输可能需要锁定部分资源,影响系统性能。

2.5. 应用层面的问题

  • 超时问题:大文件传输时间较长,可能超过默认的连接超时时间。
  • 传输失败后的重试:一旦传输中断,重新传输整个文件可能浪费大量时间和带宽。
  • 兼容性:跨平台传输时,文件格式、编码或路径可能存在不兼容问题。

3. 大文件传输技术方案

3.1. 分块传输

原理:将文件分成小块(如 1MB、10MB),逐块进行传输。

优点:减少内存占用。网络中断时,仅需重新传输未完成的部分,而非整个文件。

常用工具/技术:HTTP 分片上传:如阿里云 OSS 或 AWS S3 的分片上传。gRPC 流式传输:适合逐块传输大文件。

3.2. 断点续传

原理:在传输中断时记录传输进度,重新连接后从中断点继续。

关键技术:客户端和服务端共同维护文件传输的偏移量(offset)。例如:HTTP 的 Range 头支持分段请求

优点:提升传输可靠性。避免重复传输已完成的部分。

3.3. 流式传输

原理:按需读取和发送文件数据,而不是一次性加载整个文件到内存。

使用场景:gRPC:支持流式消息传输。Socket:通过流式 I/O 逐块发送和接收数据。

优点:降低内存消耗。适合超大文件传输(如 >1GB 文件)。

3.4. 校验完整性

传输完成后,通过校验和(如 MD5SHA-256)验证文件完整性。

优化方式:在传输过程中按块计算校验和,避免传输完成后才校验整个文件。

3.5. 限流与优先级控制

限流:对上传或下载速度进行限制,避免占用过多带宽。

优先级:为重要文件传输设置更高优先级,确保快速完成。

3.6. 使用专用工具或协议

FTP/SFTP:传统的文件传输协议,支持断点续传。优点:成熟稳定,支持大文件传输。

第三方工具:阿里云 OSS、AWS S3、Google Drive 等工具均支持大文件分片上传。

3.7. 大文件传输方案总结

问题

描述

解决方法

传输中断

网络中断或超时导致传输失败

实现断点续传,分块传输。

内存不足

文件过大导致内存溢出(OutOfMemoryError)

使用流式传输或分块处理。

传输速度慢

网络带宽不足或文件过大

压缩文件,或采用多线程并发传输。

校验耗时长

文件过大时计算校验和耗时较长

分块校验,每块单独计算和验证。

多用户资源争抢

多用户同时传输大文件时,服务器资源(CPU、带宽等)可能耗尽

实现限流、负载均衡,或引入 CDN。

传输失败后重复传输浪费

中断后需要重新传输整个文件,浪费时间和带宽

实现断点续传,仅重新传输未完成部分。

文件损坏

网络传输中的数据丢失导致文件损坏

传输完成后通过校验和验证完整性(MD5、SHA-256)。

4. 大文件传输功能实现

4.1. 分块传输实现(java)

思路:将文件分成若干小块,逐块传输。客户端和服务器共同管理块的顺序和大小。

4.1.1. 客户端:分块上传

import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;public class ChunkedFileUploader {public static void main(String[] args) throws Exception {String filePath = "path/to/large/file.zip";String serverUrl = "http://localhost:8080/upload";int chunkSize = 1024 * 1024; // 每块 1MBFile file = new File(filePath);FileInputStream fis = new FileInputStream(file);long fileLength = file.length();long offset = 0;int chunkIndex = 0;byte[] buffer = new byte[chunkSize];while (offset < fileLength) {int bytesRead = fis.read(buffer);if (bytesRead == -1) break;// 上传当前块boolean success = uploadChunk(serverUrl, buffer, bytesRead, file.getName(), chunkIndex, fileLength);if (!success) {System.out.println("Failed to upload chunk " + chunkIndex);break;}offset += bytesRead;chunkIndex++;}fis.close();}private static boolean uploadChunk(String serverUrl, byte[] chunkData, int bytesRead, String fileName, int chunkIndex, long totalSize) throws Exception {HttpURLConnection connection = (HttpURLConnection) new URL(serverUrl).openConnection();connection.setDoOutput(true);connection.setRequestMethod("POST");connection.setRequestProperty("Content-Type", "application/octet-stream");connection.setRequestProperty("File-Name", fileName);connection.setRequestProperty("Chunk-Index", String.valueOf(chunkIndex));connection.setRequestProperty("Total-Size", String.valueOf(totalSize));try (OutputStream os = connection.getOutputStream()) {os.write(chunkData, 0, bytesRead);}return connection.getResponseCode() == 200;}
}

4.1.2. 服务端:接收分块上传

import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;@RestController
@RequestMapping("/upload")
public class FileUploadController {@PostMappingpublic String uploadChunk(@RequestHeader("File-Name") String fileName,@RequestHeader("Chunk-Index") int chunkIndex,@RequestHeader("Total-Size") long totalSize,@RequestBody byte[] chunkData) throws Exception {String outputDir = "path/to/uploaded/files/";File outputFile = new File(outputDir + fileName);// 按块写入try (OutputStream os = new FileOutputStream(outputFile, true)) { // true: 追加模式os.write(chunkData);}System.out.println("Received chunk " + chunkIndex + ", size: " + chunkData.length);return "Chunk " + chunkIndex + " uploaded successfully!";}
}

4.2. 断点续传实现(java)

思路:客户端记录每次上传完成的块索引(offset)。如果传输中断,从上次成功的位置重新开始。

4.2.1. 客户端:带断点续传

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;public class ResumableFileUploader {public static void main(String[] args) throws Exception {String filePath = "path/to/large/file.zip";String serverUrl = "http://localhost:8080/upload";int chunkSize = 1024 * 1024; // 每块 1MBFile file = new File(filePath);long fileLength = file.length();long offset = getUploadedOffset(serverUrl, file.getName()); // 获取已上传的偏移量FileInputStream fis = new FileInputStream(file);fis.skip(offset);byte[] buffer = new byte[chunkSize];int chunkIndex = (int) (offset / chunkSize);while (offset < fileLength) {int bytesRead = fis.read(buffer);if (bytesRead == -1) break;boolean success = uploadChunk(serverUrl, buffer, bytesRead, file.getName(), chunkIndex, fileLength);if (!success) {System.out.println("Failed to upload chunk " + chunkIndex);break;}offset += bytesRead;chunkIndex++;}fis.close();}private static long getUploadedOffset(String serverUrl, String fileName) throws Exception {HttpURLConnection connection = (HttpURLConnection) new URL(serverUrl + "?fileName=" + fileName).openConnection();connection.setRequestMethod("GET");if (connection.getResponseCode() == 200) {BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));return Long.parseLong(reader.readLine());}return 0;}private static boolean uploadChunk(String serverUrl, byte[] chunkData, int bytesRead, String fileName, int chunkIndex, long totalSize) throws Exception {HttpURLConnection connection = (HttpURLConnection) new URL(serverUrl).openConnection();connection.setDoOutput(true);connection.setRequestMethod("POST");connection.setRequestProperty("Content-Type", "application/octet-stream");connection.setRequestProperty("File-Name", fileName);connection.setRequestProperty("Chunk-Index", String.valueOf(chunkIndex));connection.setRequestProperty("Total-Size", String.valueOf(totalSize));try (OutputStream os = connection.getOutputStream()) {os.write(chunkData, 0, bytesRead);}return connection.getResponseCode() == 200;}
}

4.2.2. 服务端:支持断点续传

import org.springframework.web.bind.annotation.*;
import java.io.File;@RestController
@RequestMapping("/upload")
public class ResumableFileUploadController {@GetMappingpublic long getUploadedOffset(@RequestParam("fileName") String fileName) {File file = new File("path/to/uploaded/files/" + fileName);return file.exists() ? file.length() : 0;}@PostMappingpublic String uploadChunk(@RequestHeader("File-Name") String fileName,@RequestHeader("Chunk-Index") int chunkIndex,@RequestHeader("Total-Size") long totalSize,@RequestBody byte[] chunkData) throws Exception {String outputDir = "path/to/uploaded/files/";File outputFile = new File(outputDir + fileName);try (OutputStream os = new FileOutputStream(outputFile, true)) { // true: 追加模式os.write(chunkData);}return "Chunk " + chunkIndex + " uploaded successfully!";}
}

4.3. 流式传输(gRPC 示例)

4.3.1. Proto 文件示例

syntax = "proto3";// 定义服务包名
package fileupload;// 指定 Java 代码生成的包名(可选)
option java_package = "com.example.fileupload";
option java_outer_classname = "FileUploadProto";// 文件上传服务定义
service FileUploadService {// 文件上传接口(客户端流模式)rpc UploadFile(stream UploadRequest) returns UploadResponse;
}// 文件上传请求消息
message UploadRequest {string fileName = 1;         // 文件名bytes chunkData = 2;         // 当前块的二进制数据int64 chunkIndex = 3;        // 当前块的索引(可选)int64 totalChunks = 4;       // 总块数(可选)
}// 文件上传响应消息
message UploadResponse {string status = 1;           // 上传状态,例如 "Success"string message = 2;          // 附加信息,例如错误原因
}

4.3.2. Proto 文件的使用

生成 gRPC 代码 使用 protoc 生成对应的 Java 文件:

protoc --java_out=. --grpc-java_out=. fileupload.proto

Maven 插件生成:

<plugin><groupId>io.grpc</groupId><artifactId>protoc-gen-grpc-java</artifactId><version>1.57.2</version>
</plugin>

服务端实现:继承生成的 FileUploadServiceGrpc.FileUploadServiceImplBase,实现 UploadFile 方法。

客户端实现:使用 FileUploadServiceGrpc.FileUploadServiceStub 创建流式调用,逐块上传文件数据。

4.3.3. gRPC 服务端实现(java)

import io.grpc.stub.StreamObserver;
import java.io.FileOutputStream;public class FileUploadServiceImpl extends FileUploadServiceGrpc.FileUploadServiceImplBase {@Overridepublic StreamObserver<UploadRequest> uploadFile(StreamObserver<UploadResponse> responseObserver) {return new StreamObserver<UploadRequest>() {private FileOutputStream fos;@Overridepublic void onNext(UploadRequest request) {try {// 初始化文件流if (fos == null) {fos = new FileOutputStream("uploaded/" + request.getFileName());}// 写入当前块的数据fos.write(request.getChunkData().toByteArray());} catch (Exception e) {responseObserver.onError(e);}}@Overridepublic void onError(Throwable t) {try {if (fos != null) fos.close();} catch (Exception ignored) {}System.err.println("Error during file upload: " + t.getMessage());}@Overridepublic void onCompleted() {try {if (fos != null) fos.close();} catch (Exception ignored) {}// 返回上传成功响应responseObserver.onNext(UploadResponse.newBuilder().setStatus("Success").setMessage("File uploaded successfully!").build());responseObserver.onCompleted();}};}
}

4.3.4. 客户端实现(java)

import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import io.grpc.stub.StreamObserver;
import java.io.FileInputStream;public class FileUploadClient {public static void main(String[] args) throws Exception {String filePath = "path/to/large/file.zip";String fileName = "file.zip";// 创建 gRPC 通道ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 8080).usePlaintext().build();FileUploadServiceGrpc.FileUploadServiceStub stub = FileUploadServiceGrpc.newStub(channel);// 创建流式请求StreamObserver<UploadRequest> requestObserver = stub.uploadFile(new StreamObserver<UploadResponse>() {@Overridepublic void onNext(UploadResponse response) {System.out.println("Server Response: " + response.getStatus() + " - " + response.getMessage());}@Overridepublic void onError(Throwable t) {System.err.println("Error: " + t.getMessage());}@Overridepublic void onCompleted() {System.out.println("File upload completed.");channel.shutdown();}});// 分块上传文件FileInputStream fis = new FileInputStream(filePath);byte[] buffer = new byte[1024 * 1024]; // 每块 1MBint bytesRead;int chunkIndex = 0;while ((bytesRead = fis.read(buffer)) != -1) {UploadRequest request = UploadRequest.newBuilder().setFileName(fileName).setChunkData(com.google.protobuf.ByteString.copyFrom(buffer, 0, bytesRead)).setChunkIndex(chunkIndex++).build();requestObserver.onNext(request);}fis.close();// 完成请求requestObserver.onCompleted();}
}

博文参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/66046.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32-笔记32-ESP8266作为服务端

esp8266作为服务器的时候&#xff0c;这时候网络助手以客户端的模式连接到esp8266&#xff0c;其中IP地址写的是esp8266作为服务器时的IP地址&#xff0c;可以使用ATCIFSR查询esp8266的ip地址&#xff0c;端口号默认写333。 当esp8266作为服务器的时候&#xff0c;需要完成哪些…

ArcGIS JSAPI 高级教程 - 通过RenderNode实现视频融合效果(不借助三方工具)

ArcGIS JSAPI 高级教程 - 通过RenderNode实现视频融合效果(不借助三方工具) 核心代码完整代码在线示例地球中展示视频可以通过替换纹理的方式实现,但是随着摄像头和无人机的流行,需要视频和场景深度融合,简单的实现方式则不能满足需求。 三维视频融合技术将视频资源与三维…

小程序组件 —— 25 组件案例 - 商品导航区域

这一节主要实现商品导航区的结构和样式&#xff0c;商品导航区没有新的知识点&#xff0c;主要使用之前学习的三个组件&#xff1a; view&#xff1a;视图容器iamge&#xff1a;图片组件text&#xff1a;文本组件 商品导航区由五个商品导航来组成&#xff0c;每一个视频导航都…

MarkDown怎么转pdf;Mark Text怎么使用;

MarkDown怎么转pdf 目录 MarkDown怎么转pdf先用CSDN进行编辑,能双向看版式;标题最后直接导出pdfMark Text怎么使用一、界面介绍二、基本操作三、视图模式四、其他功能先用CSDN进行编辑,能双向看版式; 标题最后直接导出pdf Mark Text怎么使用 Mark Text是一款简洁的开源Mar…

内网渗透:域 Kerberos 认证机制

1. Kerberos 协议简介 Kerberos 是一种网络认证协议&#xff0c;其设计目标是通过密钥系统为客户端/服务器应用程序提供强大的认证服务。 该协议具有以下特点&#xff1a; 去中心化&#xff1a;认证过程独立于主机操作系统&#xff0c;不依赖基于主机地址的信任。安全传输&a…

1961-2022年中国大陆多干旱指数数据集(SPI/SPEI/EDDI/PDSI/SC-PDSI/VPD)

DOI: 10.5194/essd-2024-270 干旱指数对于评估和管理缺水和农业风险至关重要;然而&#xff0c;现有数据集中缺乏统一的数据基础&#xff0c;导致不一致&#xff0c;对干旱指数的可比性提出了挑战。本研究致力于创建CHM_Drought&#xff0c;这是一个创新且全面的长期气象干旱数…

C# 在PDF中添加和删除水印注释 (Watermark Annotation)

目录 使用工具 C# 在PDF文档中添加水印注释 C# 在PDF文档中删除水印注释 PDF中的水印注释是一种独特的注释类型&#xff0c;它通常以透明的文本或图片形式叠加在页面内容之上&#xff0c;为文档添加标识或信息提示。与传统的静态水印不同&#xff0c;水印注释并不会永久嵌入…

LLVM防忘录

目录 Windows中源码编译LLVMWindows下编译LLVM Pass DLL Windows中源码编译LLVM 直接从llvm-project下载源码, 然后解压后用VS2022打开该目录, 然后利用VS的开发终端执行: cmake -S llvm -B build -G "Visual Studio 17 2022" -DLLVM_ENABLE_PROJECTSclang -DLLVM_…

解释一下:运放的输入失调电流

输入失调电流 首先看基础部分:这就是同相比例放大器 按照理论计算,输入VIN=0时,输出VOUT应为0,对吧 仿真与理论差距较大,有200多毫伏的偏差,这就是输入偏置电流IBIAS引起的,接着看它的定义 同向和反向输入电流的平均值,也就是Ib1、Ib2求平均,即(Ib1+Ib2)/2 按照下面…

【双指针】算法题(二)

【双指针】算法题&#xff08;二&#xff09; 前言&#xff1a; 这里是几道算法题&#xff0c;双指针说明在上一章。 一、有效三角形的个数 题目链接&#xff1a; 有效三角形的个数 题目叙述&#xff1a; 解法一&#xff1a;暴力循环&#xff0c;叠加三层for循环&#xff0c…

docker 安装influxdb

docker pull influxdb mkdir -p /root/influxdb/data docker run -d --name influxdb -p 8086:8086 -v /root/influxdb/data:/var/lib/influxdb influxdb:latest#浏览器登录&#xff1a;http://192.168.31.135:8086&#xff0c;首次登录设置用户名密码&#xff1a;admin/admin1…

深入剖析MySQL数据库架构:核心组件、存储引擎与优化策略(四)

慢查询日志&#xff0c;顾名思义&#xff0c;就是查询慢的日志&#xff0c;是指mysql记录所有执行超过long_query_time&#xff08;默认的时间10秒&#xff09;参数设定的时间阈值的SQL语句的日志。该日志能为SQL语句的优化带来很好的帮助。默认情况下&#xff0c;慢查询日志是…

Ansys Discovery 中的网格划分方法:探索模式

本篇博客文章将介绍 Ansys Discovery 中可用于在探索模式下进行分析的网格划分方法。我们将在下一篇博客中介绍 Refine 模式下的网格划分技术。 了解 Discovery Explore 模式下的网格划分 网格划分是将几何模型划分为小单元以模拟系统在不同条件下的行为的过程。这是通过创建…

MT8788安卓核心板_MTK8788核心板参数_联发科模块定制开发

MT8788安卓核心板是一款尺寸为52.5mm x 38.5mm x 2.95mm的高集成度电路板&#xff0c;专为各种智能设备应用而设计。该板卡整合了处理器、图形处理单元(GPU)、LPDDR3内存、eMMC存储及电源管理模块&#xff0c;具备出色的性能与低功耗特性。 这款核心板搭载了联发科的MT8788处理…

Linux实验报告14-Linux内存管理实验

目录 一&#xff1a;实验目的 二&#xff1a;实验内容 1、编辑模块的源代码mm_viraddr.c 2、编译模块 3、编写测试程序mm_test.c 4、编译测试程序mm_test.c 5、在后台运行mm_test 6、验证mm_viraddr模块 一&#xff1a;实验目的 (1)掌握内核空间、用户空间&#xff…

SAP物料主数据界面增加客制化字段、客制化页签的方式

文章目录 前言一、不增加页签&#xff0c;只增加客制化字段二、增加物料主数据页签 前言 【SAP系统MM模块研究】 #SAP #MM #物料 #客制化 #物料主数据 项目上难免会遇到客户要在物料主数据的界面上&#xff0c;增加新字段的需求。 实现方式有&#xff1a; &#xff08;1&…

设计心得——流程图和数据流图绘制

一、流程图和数据流图 在软件开发中&#xff0c;画流程图和数据流图可以说是几乎每个人都会遇到。 1、数据流&#xff08;程&#xff09;图 Data Flow Diagram&#xff0c;DFG。它可以称为数据流图或数据流程图。其主要用来描述系统中数据流程的一种图形工具&#xff0c;可以将…

U盘数据恢复实战指南与预防策略

一、U盘数据恢复初探 U盘数据恢复&#xff0c;简而言之&#xff0c;是指当U盘中的数据因各种原因丢失、损坏或无法访问时&#xff0c;通过特定技术和工具&#xff0c;将丢失的数据重新找回的过程。U盘作为现代生活中不可或缺的便携式存储设备&#xff0c;其数据安全性和稳定性…

持续大额亏损,销量增幅有限,北汽蓝谷依旧黯然神伤

撰稿 | 行星 来源 | 贝多财经 “起了个大早&#xff0c;赶了个晚集”&#xff0c;用在如今的北汽蓝谷身上再合适不过。 2025年的第一个工作日&#xff0c;北汽蓝谷新能源科技股份有限公司&#xff08;SH:600733&#xff0c;简称“北汽蓝谷”&#xff09;对外披露了子公司北京…

【微软,模型规模】模型参数规模泄露:理解大型语言模型的参数量级

模型参数规模泄露&#xff1a;理解大型语言模型的参数量级 关键词&#xff1a; #大型语言模型 Large Language Model #参数规模 Parameter Scale #GPT-4o #GPT-4o-mini #Claude 3.5 Sonnet 具体实例与推演 近日&#xff0c;微软在一篇医学相关论文中意外泄露了OpenAI及Claud…