【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.28 存储之道:跨平台数据持久化方案

ops/2025/1/31 18:12:16/

在这里插入图片描述
好的,我将按照您的要求生成一篇高质量的Python NumPy文章。以下是第28篇《存储之道:跨平台数据持久化方案》的完整内容,包括目录、正文和参考文献。

1.28 存储之道:跨平台数据持久化方案

目录
存储之道:跨平台数据持久化方案
1.28.1 HDF5格式的层次化存储
1.28.1.1 HDF5基础概念
1.28.1.2 HDF5的层次化数据模型
1.28.1.3 HDF5的读写操作
1.28.1.4 HDF5元数据管理技巧
1.28.2 云存储的断点续传实现
1.28.2.1 云存储概述
1.28.2.2 阿里云OSS存储集成
1.28.2.3 断点续传的实现原理
1.28.2.4 断点续传的代码示例
1.28.3 数据版本控制方案设计
1.28.3.1 数据版本控制的重要性
1.28.3.2 DVC版本控制系统整合
1.28.3.3 数据版本控制的实践案例
1.28.4 内存数据库集成实践
1.28.4.1 内存数据库概述
1.28.4.2 Redis缓存加速方案
1.28.4.3 Redis与NumPy的集成示例
1.28.5 数据校验和计算方法
1.28.5.1 数据校验的重要性和常见方法
1.28.5.2 使用NumPy进行数据校验
1.28.5.3 校验和计算方法
1.28.5.4 常见的数据校验应用场景
存储之道:跨平台数据持久化方案] --> B[HDF5层次化存储
云存储断点续传
数据版本控制
内存数据库集成
B
元数据管理
数据压缩
并行读写
分块上传
进度跟踪
错误恢复
DVC工作流
差异存储
版本回退
Redis缓存
数据结构优化
持久化策略
1.28.1 HDF5格式的层次化存储
元数据管理架构
1
*
HDF5File
+root_group: Group
+create_dataset()
+add_attribute()
+read_metadata()
Dataset
+data: ndarray
+attrs: dict
+compression: str
代码实现
python">import h5py
import numpy as np
from datetime import datetime# 创建HDF5文件并添加元数据
with h5py.File('experiment.h5', 'w') as f:# 创建根组属性f.attrs['experiment_name'] = "纳米材料分析"f.attrs['create_time'] = datetime.now().isoformat()# 创建数据集temp_data = np.random.rand(1000, 1000).astype(np.float32)dset = f.create_dataset('/measurements/temperature', data=temp_data,compression='gzip', compression_opts=9)# 添加数据集元数据dset.attrs['unit'] = '摄氏度'dset.attrs['sensor_id'] = 'TC-2023A'dset.attrs['calibration_date'] = '2023-08-15'# 读取元数据示例
with h5py.File('experiment.h5', 'r') as f:print(f"实验名称: {f.attrs['experiment_name']}")dset = f['/measurements/temperature']print(f"数据维度: {dset.shape} 压缩算法: {dset.compression}")

1.28.1.1 HDF5基础概念

HDF5(Hierarchical Data Format 5)是一种用于存储和管理大规模科学数据的文件格式。它支持多种数据类型,包括数组、表格、时间序列等,广泛应用于科学计算、大数据处理等领域。

  • HDF5文件结构:HDF5文件采用层次化结构,类似文件系统中的目录和文件。每个文件可以包含多个数据集(datasets)和组(groups),组可以嵌套多个子组和数据集。
  • 数据集:数据集是HDF5文件中的主要数据存储单元,可以存储多维数组。
  • :组用于组织和管理多个数据集和其他组,类似于文件系统中的文件夹。
1.28.1.2 HDF5的层次化数据模型

HDF5的层次化数据模型使其非常适合存储复杂的数据结构。以下是HDF5文件的基本层次化模型:

HDF5文件
组1
数据集1.1
数据集1.2
组2
组2.1
数据集2.1.1
数据集2.1.2
数据集2.2
组3
数据集3.1
数据集3.2
数据集3.3
  • 层次化结构:每个组可以包含多个数据集和其他子组,形成树状结构。
  • 数据集:数据集是实际存储数据的单元,可以是多维数组或表格。
  • 属性:每个数据集和组可以有自己的属性,用于存储元数据。
1.28.1.3 HDF5的读写操作

HDF5文件的读写操作可以通过Python的h5py库实现。以下是基本的读写操作示例:

python">import h5py
import numpy as np# 创建HDF5文件
with h5py.File('example.h5', 'w') as f:# 创建组group1 = f.create_group('group1')  # 创建组1group2 = f.create_group('group2')  # 创建组2# 创建数据集dataset1 = group1.create_dataset('dataset1', (100, 100), dtype='i')  # 在组1中创建数据集1,100x100的整数数组dataset2 = group2.create_dataset('dataset2', (50, 50), dtype='f')  # 在组2中创建数据集2,50x50的浮点数组# 写入数据dataset1[:] = np.random.randint(0, 100, size=(100, 100))  # 写入随机整数dataset2[:] = np.random.randn(50, 50)  # 写入随机浮点数# 读取HDF5文件
with h5py.File('example.h5', 'r') as f:# 读取数据data1 = f['group1/dataset1'][:]  # 读取组1中的数据集1data2 = f['group2/dataset2'][:]  # 读取组2中的数据集2# 打印数据print(data1)  # 打印数据集1的内容print(data2)  # 打印数据集2的内容
  • 创建文件:使用h5py.File创建HDF5文件,模式可以是'w'(写模式)、'r'(读模式)或'a'(追加模式)。
  • 创建组:使用create_group方法创建组。
  • 创建数据集:使用create_dataset方法在组中创建数据集。
  • 写入数据:使用切片操作[:]将数据写入数据集。
  • 读取数据:使用'/'路径符访问数据集,读取数据。
1.28.1.4 HDF5元数据管理技巧

元数据是描述数据集的附加信息,例如数据集的创建时间、描述、单位等。在HDF5文件中,可以使用属性(attributes)来存储元数据。

python">import h5py
import numpy as np# 创建HDF5文件
with h5py.File('example.h5', 'w') as f:# 创建组group1 = f.create_group('group1')# 创建数据集dataset1 = group1.create_dataset('dataset1', (100, 100), dtype='i')# 写入数据dataset1[:] = np.random.randint(0, 100, size=(100, 100))# 添加元数据dataset1.attrs['created_on'] = '2023-10-01'  # 创建时间dataset1.attrs['description'] = 'Random integers'  # 描述dataset1.attrs['unit'] = 'counts'  # 单位# 读取HDF5文件
with h5py.File('example.h5', 'r') as f:dataset1 = f['group1/dataset1']# 读取元数据created_on = dataset1.attrs['created_on']description = dataset1.attrs['description']unit = dataset1.attrs['unit']# 打印元数据print(f"创建时间: {created_on}")print(f"描述: {description}")print(f"单位: {unit}")
  • 添加元数据:使用attrs属性字典来添加元数据。
  • 读取元数据:同样使用attrs属性字典来读取元数据。

1.28.2 云存储的断点续传实现

分块上传流程
Client OSS 初始化分块上传 切割文件为5MB块 上传分块(带MD5校验) 返回分块ETag loop [分块处理] 提交完整文件 返回最终ETag Client OSS
断点续传实现
python">import oss2
import hashlib
import osclass ResumeUploader:def __init__(self, access_key, secret_key, endpoint, bucket_name):auth = oss2.Auth(access_key, secret_key)self.bucket = oss2.Bucket(auth, endpoint, bucket_name)self.part_size = 5 * 1024 * 1024  # 5MB分块def _calc_md5(self, data):"""计算数据块的MD5校验值"""md5 = hashlib.md5()md5.update(data)return md5.hexdigest()def upload(self, object_name, file_path):file_size = os.path.getsize(file_path)upload_id = self.bucket.init_multipart_upload(object_name).upload_idparts = []with open(file_path, 'rb') as f:part_number = 1offset = 0while offset < file_size:# 读取分块数据data = f.read(self.part_size)md5 = self._calc_md5(data)# 上传分块result = self.bucket.upload_part(object_name, upload_id, part_number, data)parts.append(oss2.models.PartInfo(part_number, result.etag, md5=md5))print(f"已上传分块 {part_number}/{file_size//self.part_size+1}")part_number += 1offset += len(data)# 完成上传self.bucket.complete_multipart_upload(object_name, upload_id, parts)print(f"文件 {object_name} 上传完成")# 使用示例
uploader = ResumeUploader('your_access_key', 'your_secret_key','oss-cn-hangzhou.aliyuncs.com','data-bucket'
)
uploader.upload('large_dataset.npy', '/data/scientific_data.npy')

1.28.2.1 云存储概述

云存储是将数据存储在远程服务器上,并通过网络访问和管理。常见的云存储服务提供商包括阿里云OSS、Amazon S3、Google Cloud Storage等。

  • 优点:高可用性、可扩展性、成本效益。
  • 应用场景:大数据处理、数据备份、内容分发等。
1.28.2.2 阿里云OSS存储集成

阿里云对象存储服务(OSS)提供了一种简单、可靠、安全的云存储解决方案。以下是使用Python SDK集成阿里云OSS的基本步骤:

  1. 安装阿里云OSS SDK

    pip install oss2
    
  2. 初始化OSS客户端

    python">import oss2# 初始化OSS客户端
    auth = oss2.Auth('your-access-key-id', 'your-access-key-secret')  # 替换为您的Access Key ID和Secret
    bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', 'your-bucket-name')  # 替换为您的Bucket名称和区域
    
  3. 上传和下载文件

    python"># 上传文件
    bucket.put_object_from_file('example.h5', 'local_path/example.h5')  # 从本地路径上传文件# 下载文件
    bucket.get_object_to_file('example.h5', 'local_path/example.h5')  # 从OSS下载文件到本地路径
    
  • 初始化客户端:使用oss2.Authoss2.Bucket初始化客户端。
  • 上传文件:使用put_object_from_file方法将本地文件上传到OSS。
  • 下载文件:使用get_object_to_file方法将OSS文件下载到本地。
1.28.2.3 断点续传的实现原理

断点续传是指在文件传输过程中,如果传输中断,可以从上次中断的地方继续传输,而不是重新开始。其实现原理如下:

  1. 分块上传:将大文件分割成多个小块,逐块上传。
  2. 记录上传状态:在每块上传完成后,记录当前块的上传状态。
  3. 恢复上传:在传输中断后,读取上次的上传状态,从断点处继续传输。
1.28.2.4 断点续传的代码示例

以下是使用阿里云OSS SDK实现断点续传的代码示例:

python">import oss2def upload_with_resume(bucket, object_key, local_file, part_size=1 * 1024 * 1024):"""实现断点续传上传:param bucket: OSS客户端:param object_key: 对象键:param local_file: 本地文件路径:param part_size: 分块大小,默认1MB"""# 获取文件大小file_size = os.path.getsize(local_file)# 初始化分块上传upload_id = bucket.init_multipart_upload(object_key).upload_id# 读取上传状态parts = bucket.list_parts(object_key, upload_id)uploaded_parts = {part.part_number: part.etag for part in parts.parts}# 分块上传with open(local_file, 'rb') as file:for i in range(1, int(np.ceil(file_size / part_size)) + 1):if i in uploaded_parts:print(f"跳过已上传的部分: {i}")continuestart = (i - 1) * part_sizeend = min(start + part_size, file_size)part_data = file.read(part_size)result = bucket.upload_part(object_key, upload_id, i, part_data)uploaded_parts[i] = result.etag# 完成分块上传oss2.complete_multipart_upload(bucket, object_key, upload_id, uploaded_parts)# 初始化OSS客户端
auth = oss2.Auth('your-access-key-id', 'your-access-key-secret')
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', 'your-bucket-name')# 上传文件
upload_with_resume(bucket, 'example.h5', 'local_path/example.h5')
  • 初始化分块上传:使用init_multipart_upload方法初始化分块上传,获取upload_id
  • 读取上传状态:使用list_parts方法获取已上传的块信息。
  • 分块上传:逐块上传文件,跳过已上传的部分。
  • 完成分块上传:使用complete_multipart_upload方法完成上传。

1.28.3 数据版本控制方案设计

DVC工作流架构
原始数据
DVC跟踪
元数据存储
版本更新
差异同步
云存储
代码示例
python">import subprocess
import jsonclass DVCManager:def __init__(self, repo_path):self.repo_path = repo_pathdef init_repo(self):"""初始化DVC仓库"""subprocess.run(['dvc', 'init'], cwd=self.repo_path)print("DVC仓库已初始化")def track_data(self, data_path):"""添加数据追踪"""subprocess.run(['dvc', 'add', data_path], cwd=self.repo_path)print(f"已开始追踪 {data_path}")def commit_version(self, message):"""提交数据版本"""subprocess.run(['git', 'add', '*.dvc'], cwd=self.repo_path)subprocess.run(['git', 'commit', '-m', message], cwd=self.repo_path)print(f"版本已提交: {message}")def push_data(self):"""推送数据到远程存储"""subprocess.run(['dvc', 'push'], cwd=self.repo_path)print("数据已推送到远程存储")def show_history(self):"""显示版本历史"""result = subprocess.run(['dvc', 'dag'], cwd=self.repo_path, capture_output=True)print(result.stdout.decode())# 使用示例
manager = DVCManager('/project/data')
manager.init_repo()
manager.track_data('raw_dataset.csv')
manager.commit_version("添加初始数据集")
manager.push_data()

1.28.3.1 数据版本控制的重要性

数据版本控制是指对数据的多个版本进行管理和记录,以便在需要时能够回溯到特定的版本。这对于数据科学项目尤其重要,可以确保数据的可追溯性和可复现性。

  • 版本控制的优势:数据追溯、协同工作、数据复现。
  • 常见的版本控制系统:DVC(Data Version Control)、Git LFS(Large File Storage)等。
1.28.3.2 DVC版本控制系统整合

DVC是一个专门用于数据版本控制的开源工具,可以与Git结合使用,管理大型数据文件和模型。

  1. 安装DVC

    pip install dvc
    
  2. 初始化DVC项目

    dvc init
    
  3. 添加数据文件

    dvc add example.h5
    
  4. 提交版本

    git add .dvc
    git add example.h5.dvc
    git commit -m "Add example.h5"
    
  5. 回溯版本

    git checkout <commit-hash>
    dvc checkout
    
  • 初始化项目:使用dvc init初始化DVC项目。
  • 添加数据文件:使用dvc add将数据文件添加到DVC管理。
  • 提交版本:使用Git管理DVC的元数据文件。
  • 回溯版本:使用Git和DVC回溯到特定的版本。
1.28.3.3 数据版本控制的实践案例

假设我们有一个数据集example.h5,我们需要在多个版本中管理这个数据集。以下是具体的实践步骤:

  1. 初始化DVC和Git

    dvc init
    git init
    
  2. 添加初始数据

    dvc add example.h5
    git add .dvc
    git add example.h5.dvc
    git commit -m "Initial version of example.h5"
    
  3. 修改数据并提交新版本

    python">import h5py
    import numpy as np# 修改数据
    with h5py.File('example.h5', 'a') as f:dataset1 = f['group1/dataset1']dataset1[:] = np.random.randint(0, 200, size=(100, 100))  # 修改数据集1的内容# 添加新版本
    !dvc add example.h5
    !git add .dvc
    !git add example.h5.dvc
    !git commit -m "Modified version of example.h5"
    
  4. 回溯到初始版本

    git checkout <initial-commit-hash>
    dvc checkout
    
  • 初始化DVC和Git:在项目中同时初始化DVC和Git。
  • 添加初始数据:将初始数据文件添加到DVC管理并提交Git版本。
  • 修改数据并提交新版本:修改数据文件并提交新版本。
  • 回溯到初始版本:使用Git和DVC回溯到初始版本。

1.28.4 内存数据库集成实践

Redis缓存架构
命中
未命中
应用请求
Redis查询
返回缓存数据
数据库查询
缓存结果
代码实现
python">import redis
import numpy as np
import pickle
import hashlibclass NumpyCache:def __init__(self, host='localhost', port=6379, db=0):self.pool = redis.ConnectionPool(host=host, port=port, db=db)self.client = redis.Redis(connection_pool=self.pool)def _get_key(self, func_name, args):"""生成唯一缓存键"""arg_hash = hashlib.sha256(pickle.dumps(args)).hexdigest()return f"np:{func_name}:{arg_hash}"def cached(self, func):"""装饰器实现缓存功能"""def wrapper(*args):key = self._get_key(func.__name__, args)cached_data = self.client.get(key)if cached_data:print(f"命中缓存 {key}")return pickle.loads(cached_data)else:result = func(*args)self.client.setex(key, 3600, pickle.dumps(result))  # 缓存1小时print(f"缓存新数据 {key}")return resultreturn wrapper# 使用示例
cache = NumpyCache()@cache.cached
def compute_matrix(n):"""耗时计算的矩阵生成函数"""print("执行复杂计算...")return np.random.rand(n, n) @ np.random.rand(n, n)# 第一次调用执行计算
result1 = compute_matrix(1000)  
# 第二次调用命中缓存
result2 = compute_matrix(1000)  

1.28.4.2 Redis缓存加速方案
  1. 连接Redis服务器

    python">import redis# 连接Redis服务器
    r = redis.Redis(host='localhost', port=6379, db=0)  # 连接到本地的Redis服务器
    
  2. 缓存NumPy数组

    • 将NumPy数组转换为字节

      python">import numpy as np
      import pickle# 生成NumPy数组
      data = np.random.randint(0, 100, size=(100, 100))# 将NumPy数组序列化为字节
      serialized_data = pickle.dumps(data)
      
    • 将字节数据存储到Redis

      python"># 存储到Redis
      r.set('numpy_data', serialized_data)
      
    • 从Redis读取并反序列化数据

      python"># 从Redis读取字节数据
      serialized_data = r.get('numpy_data')# 反序列化为NumPy数组
      data = pickle.loads(serialized_data)# 打印数据
      print(data)
      
  • 连接服务器:使用redis.Redis连接到Redis服务器。
  • 缓存数据:将NumPy数组序列化为字节并存储到Redis。
  • 读取数据:从Redis读取字节数据并反序列化为NumPy数组。
1.28.4.3 Redis与NumPy的集成示例

以下是一个完整的示例,展示如何在数据处理过程中使用Redis缓存NumPy数组:

python">import redis
import numpy as np
import pickle
import time# 连接Redis服务器
r = redis.Redis(host='localhost', port=6379, db=0)# 生成NumPy数组
data = np.random.randint(0, 100, size=(1000, 1000))# 将NumPy数组序列化为字节
serialized_data = pickle.dumps(data)# 记录当前时间
start_time = time.time()# 存储到Redis
r.set('numpy_data', serialized_data)# 从Redis读取字节数据
serialized_data = r.get('numpy_data')# 反序列化为NumPy数组
data = pickle.loads(serialized_data)# 记录结束时间
end_time = time.time()# 计算缓存读写时间
cache_time = end_time - start_time# 直接读写NumPy数组的时间
start_time = time.time()
data = np.random.randint(0, 100, size=(1000, 1000))
end_time = time.time()
direct_time = end_time - start_time# 比较缓存读写时间和直接读写时间
print(f"缓存读写时间: {cache_time}秒")
print(f"直接读写时间: {direct_time}秒")
  • 连接服务器:使用redis.Redis连接到Redis服务器。
  • 生成数据:生成一个1000x1000的随机整数数组。
  • 序列化数据:将NumPy数组序列化为字节。
  • 存储和读取:将数据存入Redis并读取。
  • 时间比较:比较使用Redis缓存和直接读写NumPy数组的时间。

1.28.5 数据校验和计算方法

校验和验证流程
Client Server 上传数据(带校验和) 计算接收数据校验和 确认接收成功 请求重新发送 alt [校验匹配] [校验失败] Client Server
校验算法实现
python">import hashlib
import numpy as npclass DataIntegrity:@staticmethoddef array_checksum(arr):"""计算Numpy数组的校验和"""# 将数组转换为字节流buffer = arr.tobytes()# 计算SHA256哈希值sha = hashlib.sha256()sha.update(buffer)return sha.hexdigest()@staticmethoddef verify_data(data, expected_hash):"""验证数据完整性"""current_hash = DataIntegrity.array_checksum(data)if current_hash == expected_hash:print("数据完整性验证通过")return Trueelse:print(f"校验失败!期望值: {expected_hash}\n实际值: {current_hash}")return False# 使用示例
original_data = np.random.rand(100, 100)
checksum = DataIntegrity.array_checksum(original_data)# 模拟传输过程
transmitted_data = original_data.copy()
transmitted_data[50,50] += 0.001  # 模拟数据损坏DataIntegrity.verify_data(transmitted_data, checksum)

1.28.5.1 数据校验的重要性和常见方法

数据校验是指在数据传输或存储过程中确保数据的完整性和一致性。常见的数据校验方法包括:

  • 校验和:计算数据的校验和,常用的方法有MD5、SHA-1等。
  • 校验码:使用校验码(如CRC32)进行校验。
  • 数据签名:使用数字签名技术确保数据来源的可信性。
1.28.5.2 使用NumPy进行数据校验

NumPy提供了多种数学函数,可以用于计算校验和。以下是使用NumPy计算校验和的示例:

  1. 计算MD5校验和

    python">import hashlib
    import numpy as np# 生成NumPy数组
    data = np.random.randint(0, 100, size=(100, 100))# 将NumPy数组转换为字节
    data_bytes = data.tobytes()# 计算MD5校验和
    md5_checksum = hashlib.md5(data_bytes).hexdigest()# 打印MD5校验和
    print(f"MD5校验和: {md5_checksum}")
    
  2. 计算SHA-1校验和

    python"># 计算SHA-1校验和
    sha1_checksum = hashlib.sha1(data_bytes).hexdigest()# 打印SHA-1校验和
    print(f"SHA-1校验和: {sha1_checksum}")
    
  • 生成数据:生成一个100x100的随机整数数组。
  • 转换为字节:将NumPy数组转换为字节。
  • 计算校验和:使用hashlib库计算MD5和SHA-1校验和。
1.28.5.3 校验和计算方法

校验和计算方法是确保数据完整性的关键。以下是常见的校验和计算方法:

  • MD5

    • 公式:MD5算法通过一系列复杂的数学变换将输入数据转换为128位的校验和。
    • Python实现
      python">import hashlibdef compute_md5(data):"""计算MD5校验和:param data: 输入数据(字节):return: MD5校验和(字符串)"""return hashlib.md5(data).hexdigest()# 示例
      data = b'Hello, World!'
      md5_checksum = compute_md5(data)
      print(f"MD5校验和: {md5_checksum}")
      
  • SHA-1

    • 公式:SHA-1算法通过一系列复杂的数学变换将输入数据转换为160位的校验和。
    • Python实现
      python">import hashlibdef compute_sha1(data):"""计算SHA-1校验和:param data: 输入数据(字节):return: SHA-1校验和(字符串)"""return hashlib.sha1(data).hexdigest()# 示例
      data = b'Hello, World!'
      sha1_checksum = compute_sha1(data)
      print(f"SHA-1校验和: {sha1_checksum}")
      
  • CRC32

    • 公式:CRC32算法通过循环冗余校验计算16位的校验码。
    • Python实现
      python">import zlibdef compute_crc32(data):"""计算CRC32校验码:param data: 输入数据(字节):return: CRC32校验码(整数)"""return zlib.crc32(data)# 示例
      data = b'Hello, World!'
      crc32_checksum = compute_crc32(data)
      print(f"CRC32校验码: {crc32_checksum}")
      
1.28.5.4 常见的数据校验应用场景

数据校验在多个场景中都有重要应用:

  • 文件传输:确保文件在传输过程中没有损坏。
  • 数据备份:确保备份数据与原数据一致。
  • 数据一致性校验:在分布式系统中确保数据的一致性。

参考文献

序号名称链接
1HDF5官方文档HDF Group
2h5py官方文档h5py官网
3阿里云OSS官方文档阿里云OSS
4Python oss2库文档oss2官方文档
5DVC官方文档DVC官网
6Git LFS官方文档Git LFS官网
7Redis官方文档Redis官网
8Python redis库文档redis-py官方文档
9NumPy官方文档NumPy官网
10hashlib库官方文档Python hashlib官方文档
11zlib库官方文档Python zlib官方文档
12循环冗余校验(CRC)Wikipedia CRC
13MD5校验和算法Wikipedia MD5
14SHA-1校验和算法Wikipedia SHA-1
15数据校验的重要性GeeksforGeeks Data Validation
16Python数据科学手册Python Data Science Handbook
17数据版本控制最佳实践Data Version Control Best Practices
18数字签名技术Digital Signature
19跨平台数据持久化设计Cross-Platform Data Persistence
20阿里云断点续传文档阿里云断点续传文档

这篇文章包含了详细的原理介绍、代码示例、源码注释以及案例等。希望这对您有帮助。如果有任何问题请随私信或评论告诉我。


http://www.ppmy.cn/ops/154541.html

相关文章

【深度分析】DeepSeek大模型技术解析:从架构到应用的全面探索

深度与创新&#xff1a;AI领域的革新者 DeepSeek&#xff0c;这个由幻方量化创立的人工智能公司推出的一系列AI模型&#xff0c;不仅在技术架构上展现出了前所未有的突破&#xff0c;更在应用领域中开启了无限可能的大门。从其混合专家架构&#xff08;MoE&#xff09;到多头潜…

(一)QT的简介与环境配置WIN11

目录 一、QT的概述 二、QT的下载 三、简单编程 常用快捷键 一、QT的概述 简介 Qt&#xff08;发音&#xff1a;[kjuːt]&#xff0c;类似“cute”&#xff09;是一个跨平台的开发库&#xff0c;主要用于开发图形用户界面&#xff08;GUI&#xff09;应用程序&#xff0c;…

蓝桥云客 好数

0好数 - 蓝桥云课 问题描述 一个整数如果按从低位到高位的顺序&#xff0c;奇数位&#xff08;个位、百位、万位…&#xff09;上的数字是奇数&#xff0c;偶数位&#xff08;十位、千位、十万位…&#xff09;上的数字是偶数&#xff0c;我们就称之为“好数”。 给定一个正…

哈希表实现

目录 1. 哈希概念 1.1 直接定址法 1.2 哈希冲突 1.3 负载因子 1.4 将关键字转为整型 1.5 哈希函数 1.5.1 除法散列法/除留余数法 1.5.2 乘法散列法 1.5.3 全域散列法 1.5.4 其他方法 1.6 处理哈希冲突 1.6.1 开放定址法 1.6.1.1 线性探测 1.6.1.2 二次探测 1.6.…

前端表单验证终极指南:HTML5 内置验证 + JavaScript 自定义校验

系列文章目录 01-从零开始学 HTML&#xff1a;构建网页的基本框架与技巧 02-HTML常见文本标签解析&#xff1a;从基础到进阶的全面指南 03-HTML从入门到精通&#xff1a;链接与图像标签全解析 04-HTML 列表标签全解析&#xff1a;无序与有序列表的深度应用 05-HTML表格标签全面…

Jetson Orin Nano Super之pytorch + torchvision安装

Jetson Orin Nano Super之pytorch torchvision安装 1 源由2. 安装pytorch2.1 NVIDIA手动版本下载2.2 开源自己编译版本 3. 安装torchvision4. 参考资料 1 源由 Yolo incompatible with Jetpack 6.2(Jetson Orin Nano Super)Yolo incompatible with Jetpack 6.2(Jetson Orin N…

计算机网络三张表(ARP表、MAC表、路由表)总结

参考&#xff1a; 网络三张表&#xff1a;ARP表, MAC表, 路由表&#xff0c;实现你的网络自由&#xff01;&#xff01;_mac表、arp表、路由表-CSDN博客 网络中的三张表&#xff1a;ARP表、MAC表、路由表 首先要明确一件事&#xff0c;如果一个主机要发送数据&#xff0c;那么必…

代码随想录算法训练营第三十九天-动态规划-337. 打家劫舍 III

老师讲这是树形dp的入门题目解题思路是以二叉树的遍历&#xff08;递归三部曲&#xff09;再结合动规五部曲dp数组如何定义&#xff1a;只需要定义一个二个元素的数组&#xff0c;dp[0]与dp[1] dp[0]表示不偷当前节点的最大价值dp[1]表示偷当前节点后的最大价值这样可以把每个节…