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

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

在这里插入图片描述
好的,我将按照您的要求生成一篇高质量的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
代码实现
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库实现。以下是基本的读写操作示例:

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)来存储元数据。

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
断点续传实现
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客户端

    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. 上传和下载文件

    # 上传文件
    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实现断点续传的代码示例:

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跟踪
元数据存储
版本更新
差异同步
云存储
代码示例
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. 修改数据并提交新版本

    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查询
返回缓存数据
数据库查询
缓存结果
代码实现
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服务器

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

    • 将NumPy数组转换为字节

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

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

      # 从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数组:

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
校验算法实现
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校验和

    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校验和

    # 计算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实现
      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实现
      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实现
      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阿里云断点续传文档阿里云断点续传文档

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

相关文章:

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

好的&#xff0c;我将按照您的要求生成一篇高质量的Python NumPy文章。以下是第28篇《存储之道&#xff1a;跨平台数据持久化方案》的完整内容&#xff0c;包括目录、正文和参考文献。 1.28 存储之道&#xff1a;跨平台数据持久化方案 目录 #mermaid-svg-n1z37AP8obEgptkD {f…...

chrome源码剖析—UI架构消息机制

Chrome 浏览器的 UI 架构是高度模块化且基于现代图形技术和用户界面设计理念构建的。它的 UI 架构涵盖了窗口、标签页、控件、通知、菜单等组件的管理和交互。Chrome 的 UI 基本上是通过 views 框架和 Aura&#xff08;Chrome 自己的 UI 层&#xff09;构建的&#xff0c;后者又…...

面试经典150题——图的广度优先搜索

文章目录 1、蛇梯棋1.1 题目链接1.2 题目描述1.3 解题代码1.4 解题思路 2、最小基因变化2.1 题目链接2.2 题目描述2.3 解题代码2.4 解题思路 3、单词接龙3.1 题目链接3.2 题目描述3.3 解题代码3.4 解题思路 1、蛇梯棋 1.1 题目链接 点击跳转到题目位置 1.2 题目描述 给你一…...

Day30-【AI思考】-错题分类进阶体系——12维错误定位模型

文章目录 错题分类进阶体系——12维错误定位模型**一、认知层错误&#xff08;根源性缺陷&#xff09;****二、操作层错误&#xff08;执行过程偏差&#xff09;****三、心理层错误&#xff08;元认知障碍&#xff09;****四、进阶错误&#xff08;专业级陷阱&#xff09;** 错…...

利用Edu邮箱解锁Notion Pro,提升学习与工作效率

摘要&#xff1a; 本文将详细介绍如何通过Edu教育邮箱申请教育订阅&#xff0c;从而免费获得Notion Pro版的所有高级功能。此外&#xff0c;我们还将简要提及Edu邮箱的其他福利&#xff0c;如申请Azure 100免费VPS和OpenAI。通过对比Notion免费版和Pro版的差异&#xff0c;你将…...

剑指 Offer II 010. 和为 k 的子数组

comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20010.%20%E5%92%8C%E4%B8%BA%20k%20%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84/README.md 剑指 Offer II 010. 和为 k 的子数组 题目描述 给定一个正整数数组和一个…...

【外文原版书阅读】《机器学习前置知识》2.用看电影推荐的例子带你深入了解向量点积在机器学习的作用

目录 3.3 Where Are You Looking, Vector? The Dot Product 个人主页&#xff1a;Icomi 大家好&#xff0c;我是Icomi&#xff0c;本专栏是我阅读外文原版书《Before Machine Learning》对于文章中我认为能够增进线性代数与机器学习之间的理解的内容的一个输出&#xff0c;希望…...

Vue.js组件开发-实现全屏平滑移动、自适应图片全屏滑动切换

使用Vue实现全屏平滑移动、自适应图片全屏滑动切换的功能。使用Vue 3和Vue Router&#xff0c;并结合一些CSS样式来完成这个效果。 步骤 创建Vue项目&#xff1a;使用Vue CLI创建一个新的Vue项目。准备图片&#xff1a;将需要展示的图片放在项目的public目录下。创建组件&…...

openRv1126 AI算法部署实战之——ONNX模型部署实战

在RV1126开发板上部署ONNX算法&#xff0c;实时目标检测RTSP传输。视频演示地址 rv1126 yolov5 实时目标检测 rtsp传输_哔哩哔哩_bilibili 一、准备工作 1.从官网下载YOLOv5-v7.0工程&#xff08;YOLOv5的第7个版本&#xff09; 手动在线下载&#xff1a; Releases ultraly…...

实验作业管理系统的设计与实现

标题:实验作业管理系统的设计与实现 内容:1.摘要 本系统旨在解决当前实验作业管理中存在的问题&#xff0c;提高管理效率和质量。通过对现有系统的调研和分析&#xff0c;我们确定了系统的功能需求和性能要求&#xff0c;并采用了先进的技术和架构进行设计和实现。系统实现了实…...

【愚公系列】《循序渐进Vue.js 3.x前端开发实践》032-组件的Teleport功能

标题详情作者简介愚公搬代码头衔华为云特约编辑&#xff0c;华为云云享专家&#xff0c;华为开发者专家&#xff0c;华为产品云测专家&#xff0c;CSDN博客专家&#xff0c;CSDN商业化专家&#xff0c;阿里云专家博主&#xff0c;阿里云签约作者&#xff0c;腾讯云优秀博主&…...

leetcode——二叉树的最大深度(java)

给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 示例 2&#xff1a; 输入&#xff1a;root [1,null,2] 输…...

【PyTorch】3.张量类型转换

个人主页&#xff1a;Icomi 在深度学习蓬勃发展的当下&#xff0c;PyTorch 是不可或缺的工具。它作为强大的深度学习框架&#xff0c;为构建和训练神经网络提供了高效且灵活的平台。神经网络作为人工智能的核心技术&#xff0c;能够处理复杂的数据模式。通过 PyTorch&#xff0…...

自制一个入门STM32 四足机器人具体开发顺序

0 前期准备 1. 知识储备 学习 STM32 微控制器的基础知识&#xff0c;包括 GPIO、定时器、串口通信等外设的使用&#xff0c;可通过官方文档、教程和视频课程进行学习。了解舵机控制原理&#xff0c;因为四足机器人通常使用舵机来实现关节运动。掌握基本的机械结构设计知识&am…...

SpringCloud基础二(完结)

HTTP客户端Feign 在SpringCloud基础一中&#xff0c;我们利用RestTemplate结合服务注册与发现来发起远程调用的代码如下&#xff1a; String url "http://userservice/user/" order.getUserId(); User user restTemplate.getForObject(url, User.class);以上代码就…...

云原生时代,如何构建高效分布式监控系统

文章目录 一.监控现状二.Thanos原理分析SidecarQuerierStoreCompactor 三.Sidecar or ReceiverThanos Receiver工作原理 四.分布式运维架构 一.监控现状 Prometheus是CNCF基金会管理的一个开源监控项目&#xff0c;由于其良好的架构设计和完善的生态&#xff0c;迅速成为了监控…...

WordPress使用(1)

1. 概述 WordPress是一个开源博客框架&#xff0c;配合不同主题&#xff0c;可以有多种展现方式&#xff0c;博客、企业官网、CMS系统等&#xff0c;都可以很好的实现。 官网&#xff1a;博客工具、发布平台和内容管理系统 – WordPress.org China 简体中文&#xff0c;这里可…...

小白爬虫冒险之反“反爬”:无限debugger、禁用开发者工具、干扰控制台...(持续更新)

背景浅谈 小白踏足JS逆向领域也有一年了&#xff0c;对于逆向这个需求呢主要要求就是让我们去破解**“反爬机制”**&#xff0c;即反“反爬”&#xff0c;脚本处理层面一般都是decipher网站对request设置的cipher&#xff0c;比如破解一个DES/AES加密拿到key。这篇文章先不去谈…...

Time Constant | RC、RL 和 RLC 电路中的时间常数

注&#xff1a;本文为 “Time Constant” 相关文章合辑。 机翻&#xff0c;未校。 How To Find The Time Constant in RC and RL Circuits June 8, 2024 &#x1f4a1; Key learnings: 关键学习点&#xff1a; Time Constant Definition: The time constant (τ) is define…...

Python爬虫学习第三弹 —— Xpath 页面解析 实现无广百·度

早上好啊&#xff0c;大佬们。上回使用 Beautiful Soup 进行页面解析的内容是不是已经理解得十分透彻了~ 这回我们再来尝试使用另外一种页面解析&#xff0c;来重构上一期里写的那些代码。 讲完Xpath之后&#xff0c;小白兔会带大家解决上期里百度搜索的代码编写&#xff0c;保…...

JS 正则表达式 -- 分组【详解】含普通分组、命名分组、反向引用

普通分组 使用圆括号 () 来创建分组捕获匹配的内容&#xff0c;通过正则表达式匹配结果的数组来访问这些捕获的内容。 const str "Hello, World!"; const regex /(Hello), (World)!$/; const match str.match(regex);if (match) {console.log("完整匹配结果…...

Leetcode刷题-不定长滑动窗口

分享丨【题单】滑动窗口与双指针&#xff08;定长/不定长/单序列/双序列/三指针/分组循环&#xff09; - 力扣&#xff08;LeetCode&#xff09; 3090 class Solution:def maximumLengthSubstring(self, s: str) -> int:c Counter()res 0rk -1for i in range(len(s)):i…...

【Rust自学】15.6. RefCell与内部可变性:“摆脱”安全性限制

题外话&#xff0c;这篇文章一共4050字&#xff0c;是截止到目前为止最长的文章&#xff0c;如果你能坚持读完并理解&#xff0c;那真的很强&#xff01; 喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以…...

护眼好帮手:Windows显示器调节工具

在长时间使用电脑的过程中&#xff0c;显示器的亮度和色温对眼睛的舒适度有着重要影响。传统的显示器调节方式不仅操作繁琐&#xff0c;而且在低亮度下容易导致色彩失真。因此&#xff0c;今天我想为大家介绍一款适用于Windows系统的护眼工具&#xff0c;它可以帮助你轻松调节显…...

使用 OpenResty 构建高效的动态图片水印代理服务20250127

使用 OpenResty 构建高效的动态图片水印代理服务 在当今数字化的时代&#xff0c;图片在各种业务场景中广泛应用。为了保护版权、统一品牌形象&#xff0c;动态图片水印功能显得尤为重要。然而&#xff0c;直接在后端服务中集成水印功能&#xff0c;往往会带来代码复杂度增加、…...

36、【OS】【Nuttx】OSTest分析(2):环境变量测试

背景 2025.1.29 蛇年快乐&#xff01; 接之前wiki 35、【OS】【Nuttx】OSTest分析&#xff08;1&#xff09;&#xff1a;stdio测试&#xff08;五&#xff09; 已经分析完了第一个测试项&#xff0c;输入输出端口测试&#xff0c;接下来分析下环境变量测试&#xff0c;也比较…...

C++并发编程指南04

文章目录 共享数据的问题3.1.1 条件竞争双链表的例子条件竞争示例恶性条件竞争的特点 3.1.2 避免恶性条件竞争1. 使用互斥量保护共享数据结构2. 无锁编程3. 软件事务内存&#xff08;STM&#xff09; 总结互斥量与共享数据保护3.2.1 互斥量使用互斥量保护共享数据示例代码&…...

Java实现LRU缓存策略实战

实现LRU模型选择LRU缓存回收算法集成Google Guava(LRU缓存策略)插件Google Guava(LRU策略)缓存示例总结LRU(Least Recently Used,最近最少使用)缓存是一种常见的缓存淘汰策略。它的基本思想是优先保留最近被访问过的数据,淘汰最久未被访问的数据。这种策略的目的是为了…...

三个不推荐使用的线程池

线程池的种类 其实看似这么多的线程池&#xff0c;都离不开ThreadPoolExecutor去创建&#xff0c;只不过他们是简化一些参数 newFixedThreadPool 里面全是核心线程 有资源耗尽的风险&#xff0c;任务队列最大长度为Integer.MAX_VALUE&#xff0c;可能会堆积大量的请求&#xff…...

Golang 并发机制-1:Golang并发特性概述

并发是现代软件开发中的一个基本概念&#xff0c;它使程序能够同时执行多个任务&#xff0c;从而提高效率和响应能力。在本文中&#xff0c;我们将探讨并发性在现代软件开发中的重要性&#xff0c;并深入研究Go处理并发任务的独特方法。 并发的重要性 增强性能 并发在提高软…...

Flink中的时间和窗口

在批处理统计中&#xff0c;我们可以等待一批数据都到齐后&#xff0c;统一处理。但是在实时处理统计中&#xff0c;我们是来一条就得处理一条&#xff0c;那么我们怎么统计最近一段时间内的数据呢&#xff1f;引入“窗口”。 所谓的“窗口”&#xff0c;一般就是划定的一段时…...

Alfresco Content Services dockerCompose自动化部署详尽操作

Alfresco Content Services docker社区部署文档 Alfresco Content Services简介 官方说明书 https://support.hyland.com/r/Alfresco/Alfresco-Content-Services-Community-Edition/23.4/Alfresco-Content-Services-Community-Edition/Using/Content/Folder-rules/Defining-…...

吴恩达深度学习——深层神经网络

来自https://www.bilibili.com/video/BV1FT4y1E74V&#xff0c;仅为本人学习所用。 符号约定 对于该深层网络&#xff0c;有四层&#xff0c;包含三个隐藏层和一个输出层。 隐藏层中&#xff0c;第一层有五个单元、第二层有五个单元&#xff0c;第三层有三个单元。标记 l l l…...

【算法设计与分析】实验1:字符串匹配问题的算法设计与求解

目录 一、实验目的 二、实验环境 三、实验内容 四、核心代码 五、记录与处理 六、思考与总结 七、完整报告和成果文件提取链接 一、实验目的 给定一个文本&#xff0c;在该文本中查找并定位任意给定字符串。 1、深刻理解并掌握蛮力法的设计思想&#xff1b; 2、提高应用…...

C语言二级题解:查找字母以及其他字符个数、数字字符串转双精度值、二维数组上下三角区域数据对调

目录 一、程序填空题 --- 查找字母以及其他字符个数 题目 分析 二、程序修改 --- 数字字符串转双精度值 题目 分析 小数位字符串转数字 三、程序设计 --- 二维数组上下三角区域数据对调 题目 分析 前言 本文来讲解&#xff1a; 查找字母以及其他字符个数、数字字符串…...

Git进阶之旅:Git 配置信息 Config

Git 配置级别&#xff1a; 仓库级别&#xff1a;local [ 优先级最高 ]用户级别&#xff1a;global [ 优先级次之 ]系统级别&#xff1a;system [ 优先级最低 ] 配置文件位置&#xff1a; git 仓库级别对应的配置文件是当前仓库下的 .git/configgit 用户级别对应的配置文件时用…...

Qwen2-VL:在任何分辨率下增强视觉语言模型对世界的感知 (大型视觉模型 核心技术 分享)

摘要 我们推出了Qwen2-VL系列,这是对之前Qwen-VL模型的高级升级,重新定义了视觉处理中的常规预设分辨率方法。Qwen2-VL引入了Naive Dynamic Resolution机制,使模型能够动态地将不同分辨率的图像转换为不同的视觉令牌数量。这种方法允许模型生成更高效和准确的视觉表示,紧密…...

【C语言】在Windows上为可执行文件.exe添加自定义图标

本文详细介绍了在 Windows 环境下,如何为使用 GCC 编译器编译的 C程序 添加自定义图标,从而生成带有图标的 .exe 可执行文件。通过本文的指导,读者可以了解到所需的条件以及具体的操作步骤,使生成的程序更具专业性和个性化。 目录 1. 准备条件2. 具体步骤步骤 1: 准备资源文…...

记录 | Docker的windows版安装

目录 前言一、1.1 打开“启用或关闭Windows功能”1.2 安装“WSL”方式1&#xff1a;命令行下载方式2&#xff1a;离线包下载 二、Docker Desktop更新时间 前言 参考文章&#xff1a;Windows Subsystem for Linux——解决WSL更新速度慢的方案 参考视频&#xff1a;一个视频解决D…...

FortiOS 存在身份验证绕过导致命令执行漏洞(CVE-2024-55591)

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...

系统思考—心智模式

“我们的大脑对连贯性的渴望远胜于对准确性的追求。”—诺贝尔经济学得主丹尼尔卡尼曼 在面对复杂的决策时&#xff0c;我们往往更倾向于寻找那些能够迅速串联起来的信息&#xff0c;而非深入挖掘每一个细节的真实性。这种倾向在日常生活中或许能帮助我们迅速作出决策&#xf…...

【信息系统项目管理师-选择真题】2008上半年综合知识答案和详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7~8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16~20题】【第21题】【第22题】【第23题】【第24题】【第25题…...

深入理解三高架构:高可用性、高性能、高扩展性的最佳实践

引言 在现代互联网环境下&#xff0c;随着用户规模和业务需求的快速增长&#xff0c;系统架构的设计变得尤为重要。为了确保系统能够在高负载和复杂场景下稳定运行&#xff0c;"三高架构"&#xff08;高可用性、高性能、高扩展性&#xff09;成为技术架构设计中的核…...

从 SAP 功能顾问到解决方案架构师:破茧成蝶之路

目录 行业瞭望&#xff1a;架构师崭露头角 现状剖析&#xff1a;功能顾问的局限与机遇 能力跃迁&#xff1a;转型的核心要素 &#xff08;一&#xff09;专业深度的掘进 &#xff08;二&#xff09;集成能力的拓展 &#xff08;三&#xff09;知识广度的延伸 &#xff0…...

《从因果关系的角度学习失真不变表示以用于图像恢复》学习笔记

paper&#xff1a;2303.06859 GitHub&#xff1a;lixinustc/Causal-IR-DIL: Distortion invariant feature learning for image restoration from a causality perspective 2023 CVPR 目录 摘要 1、介绍 1.1 图像修复任务 1.2 失真不变表示学习 1.3 因果效应估计的挑战…...

STM32 PWM驱动直流电机

接线图&#xff1a; 代码配置&#xff1a; 根据驱动舵机的代码来写&#xff0c;与舵机不同的是&#xff0c;这次的引脚接到了PA2上&#xff0c;所以需要改一下引脚以及改为OC3通道。 另外还需在配置两个GPIO引脚&#xff0c;来控制电机的旋转方向&#xff0c;这里连接到了PA4与…...

【Hadoop】Hadoop 概述

Hadoop 概述 Hadoop 是什么Hadoop 发展历史Hadoop 三大发行版本Hadoop 优势&#xff08;4 高&#xff09;Hadoop 组成&#xff08;面试重点&#xff09;HDFS 架构概述YARN 架构概述MapReduce 架构概述HDFS、YARN、MapReduce 三者关系 大数据技术生态体系 Hadoop 是什么 Hadoop…...

【仪器分析】FACTs-幅度

** 当然&#xff0c;这回是一篇没有插图的文章&#xff0c;但是有足够多的描述可以用来想象。 我拿这个系列当作前传试试水 引言。正弦信号可能会发生怎样的变化&#xff1f; ** 近日学FACTs&#xff0c;险些成为传函丁真&#xff0c; 如果从仪器角度考察正弦信号的测量&…...

deepseek R1的确不错,特别是深度思考模式

deepseek R1的确不错&#xff0c;特别是深度思考模式&#xff0c;每次都能自我反省改进。比如我让 它写文案&#xff1a; 【赛博朋克版程序员新春密码——2025我们来破局】 亲爱的代码骑士们&#xff1a; 当CtrlS的肌肉记忆遇上抢票插件&#xff0c;当Spring Boot的…...

Unity敌人逻辑笔记

写ai逻辑基本上都需要状态机。因为懒得手搓状态机&#xff0c;所以选择直接用动画状态机当逻辑状态机用。 架构设计 因为敌人的根节点已经有一个animator控制动画&#xff0c;只能增加一个子节点AI&#xff0c;给它加一个animator指向逻辑“动画”状态机。还有一个脚本&#…...