【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.14 内存映射:处理超大型数组的终极方案
2.14 内存映射:处理超大型数组的终极方案
目录
2.14.1 内存映射的基本原理
内存映射(Memory-Mapped Files, mmap)是一种将文件内容映射到内存中的技术。通过这种方式,可以方便地在内存中对大文件进行读写操作,而不需要将整个文件加载到内存中。这在处理超大型数组时非常有用,特别是处理 TB 级数据。
- 内存映射的定义:内存映射的基本概念和工作原理。
- NumPy mplab:NumPy 中如何使用内存映射。
- 应用场景:内存映射在数据科学和机器学习中的应用场景。
2.14.2 磁盘-内存数据交换
内存映射的核心机制是磁盘和内存之间的数据交换。通过这种方式,可以高效地处理超出内存容量的大型数据集。
- 数据交换过程:磁盘-内存数据交换的详细步骤。
- 性能优化:如何优化数据交换过程以提高性能。
- 实际案例:一个处理大型数据集的实际案例。
import numpy as np
import os# 创建一个 10TB 的文件
filename = 'large_array.npy'
size = 10 * 1024 * 1024 * 1024 * 1024 # 10TB
shape = (size // 4,) # 假设每个元素是 4 字节的整数# 如果文件不存在,创建并初始化
if not os.path.exists(filename):np.save(filename, np.zeros(shape, dtype=np.int32))# 使用 memmap 创建内存映射数组
large_array = np.memmap(filename, dtype='int32', mode='r+', shape=shape)# 读取部分数据
partial_data = large_array[:10000]
print(f"读取的部分数据: \n{partial_data}")# 写入部分数据
large_array[10000:20000] = np.arange(10000, 20000)
print(f"写入的部分数据: \n{large_array[10000:20000]}")# 关闭内存映射文件
large_array.flush()
2.14.3 读写锁机制
内存映射在多线程或多进程环境中需要特别注意读写锁机制,以确保数据的一致性和并发安全。
- 读写锁的基本概念:读写锁的工作原理和应用场景。
- NumPy memmap 读写锁:如何在 NumPy 中使用读写锁。
- 性能对比:读写锁对性能的影响。
import numpy as np
import os
import threading
import multiprocessing# 创建一个 1GB 的文件
filename = 'lock_array.npy'
size = 1 * 1024 * 1024 * 1024 # 1GB
shape = (size // 4,) # 假设每个元素是 4 字节的整数# 如果文件不存在,创建并初始化
if not os.path.exists(filename):np.save(filename, np.zeros(shape, dtype=np.int32))# 使用 memmap 创建内存映射数组
lock_array = np.memmap(filename, dtype='int32', mode='r+', shape=shape)# 创建一个线程锁
read_write_lock = threading.Lock()def read_data(index):with read_write_lock:data = lock_array[index:index+100]print(f"线程读取的部分数据: \n{data}")def write_data(index, value):with read_write_lock:lock_array[index:index+100] = valueprint(f"线程写入的部分数据: \n{lock_array[index:index+100]}")# 创建并启动读取线程
read_thread = threading.Thread(target=read_data, args=(1000,))
read_thread.start()# 创建并启动写入线程
write_thread = threading.Thread(target=write_data, args=(2000, np.arange(100)))
write_thread.start()# 等待所有线程完成
read_thread.join()
write_thread.join()# 关闭内存映射文件
lock_array.flush()
2.14.4 气象数据案例分析
气象数据集通常非常庞大,内存映射技术可以显著提高处理这些数据的效率。通过一个具体的气象数据案例,展示如何使用 memmap
高效处理大型数据集。
- 气象数据的基本特征:气象数据集的特点和常见数据格式。
- 传统方法的问题:使用传统方法处理气象数据时的性能问题。
- 使用 memmap 优化:如何使用
memmap
优化气象数据处理。 - 性能对比:优化前后性能的对比。
import numpy as np
import time# 假设有一个 10TB 的气象数据文件
filename = 'weather_data.npy'
size = 10 * 1024 * 1024 * 1024 * 1024 # 10TB
shape = (size // 4,) # 假设每个元素是 4 字节的整数# 如果文件不存在,创建并初始化
if not os.path.exists(filename):np.save(filename, np.zeros(shape, dtype=np.int32))# 使用 memmap 创建内存映射数组
weather_array = np.memmap(filename, dtype='int32', mode='r+', shape=shape)# 传统方法读取数据
def traditional_read_data(data, index, size):return data[index:index+size]start_time = time.time()
traditional_data = traditional_read_data(np.load(filename, mmap_mode='r+'), 10000, 10000)
traditional_time = time.time() - start_time
print(f"传统方法读取数据: \n{traditional_data}")
print(f"传统方法用时: {traditional_time:.2f}秒")# 使用 memmap 读取数据
def memmap_read_data(data, index, size):return data[index:index+size]start_time = time.time()
memmap_data = memmap_read_data(weather_array, 10000, 10000)
memmap_time = time.time() - start_time
print(f"使用 memmap 读取数据: \n{memmap_data}")
print(f"使用 memmap 用时: {memmap_time:.2f}秒")# 性能对比
speedup = traditional_time / memmap_time
print(f"使用 memmap 性能提升: {speedup:.2f}倍")
2.14.5 最佳实践与注意事项
在实际应用中,合理使用 memmap
可以显著提高代码的性能和稳定性。以下是一些最佳实践和注意事项。
- 合理设置文件大小:根据数据集的大小和系统资源合理设置文件大小。
- 数据格式的选择:选择合适的数据格式以优化性能。
- 并发控制:确保在多线程或多进程环境中的并发安全。
- 内存管理:注意内存管理,避免内存泄露。
- 错误处理:如何处理常见的错误和异常情况。
import numpy as np
import os# 合理设置文件大小
def create_memmap_file(filename, size, dtype):shape = (size // np.dtype(dtype).itemsize,)if not os.path.exists(filename):np.save(filename, np.zeros(shape, dtype=dtype))return np.memmap(filename, dtype=dtype, mode='r+', shape=shape)# 选择合适的数据格式
memmap_array = create_memmap_file('data_with_dtype.npy', 1 * 1024 * 1024 * 1024 * 1024, 'float32') # 1TB float32 数据
print(f"数据格式: {memmap_array.dtype}")# 并发控制
def safe_read_data(data, index, size, lock):with lock:return data[index:index+size]def safe_write_data(data, index, size, value, lock):with lock:data[index:index+size] = valueread_write_lock = threading.Lock()# 读取数据
memmap_data = safe_read_data(memmap_array, 10000, 10000, read_write_lock)
print(f"安全读取的数据: \n{memmap_data}")# 写入数据
safe_write_data(memmap_array, 20000, 10000, np.arange(10000), read_write_lock)
print(f"安全写入的数据: \n{memmap_array[20000:30000]}")# 内存管理
def manage_memory(data, threshold=1 * 1024 * 1024 * 1024): # 1GBif data.nbytes > threshold:data.flush()data = None # 释放内存return datamemmap_array = manage_memory(memmap_array)# 错误处理
def handle_errors(data, index, size):try:return data[index:index+size]except ValueError as e:print(f"错误: {e}")return Nonememmap_data = handle_errors(memmap_array, 10000, 10000)
print(f"处理错误后的数据: \n{memmap_data}")
2.14.6 总结
- 关键收获:理解内存映射的基本原理和用途,掌握磁盘-内存数据交换的机制,了解读写锁的使用方法,通过气象数据案例展示
memmap
的性能优势,遵循最佳实践和注意事项。 - 应用场景:内存映射在处理超大型数组、数据流处理、实时数据分析等场景中的应用。
- 性能优化:合理设置文件大小和数据格式,使用读写锁机制,优化内存管理,处理常见错误。
通过本文,我们深入探讨了 NumPy 中内存映射技术的使用方法和原理,包括磁盘-内存数据交换、读写锁机制、气象数据案例分析以及最佳实践与注意事项。希望这些内容能帮助你在实际开发中高效处理大型数据集,提高代码性能,避免常见的内存陷阱。
2.14.7 参考文献
参考资料 | 链接 |
---|---|
《NumPy Beginner’s Guide》 | NumPy Beginner’s Guide |
《Python for Data Analysis》 | Python for Data Analysis |
NumPy 官方文档 | NumPy Reference |
Stack Overflow | What is a memory-mapped file? |
Medium | Efficiently Handling Large Data with NumPy Memmap |
Python Memory Management | Python Memory Management |
SciPy 官方文档 | SciPy Memory Efficiency |
Wikipedia | Memory-mapped file |
《高性能Python》 | High Performance Python |
《Python数据科学手册》 | Python Data Science Handbook |
Intel MKL | Intel Math Kernel Library (MKL) |
OpenBLAS | OpenBLAS Documentation |
数据科学博客 | Handling Large Datasets with Numpy Memmap |
GitHub 代码示例 | NumPy Memmap Examples |
这篇文章包含了详细的原理介绍、代码示例、源码注释以及案例等。希望这对您有帮助。如果有任何问题请随私信或评论告诉我。
相关文章:

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.14 内存映射:处理超大型数组的终极方案
2.14 内存映射:处理超大型数组的终极方案 目录 #mermaid-svg-G91Kn9O4eN2k8xEo {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-G91Kn9O4eN2k8xEo .error-icon{fill:#552222;}#mermaid-svg-G91Kn9O4eN2k…...

【C++】STL——vector的使用
目录 💕1.vector介绍 💕2.vector的基本用法 💕3.vector功能的具体用法 (讲解) 💕4.vector——size,capacity函数的使用 (简单略讲) 💕5.resizeÿ…...
springboot/ssm互联网智慧医院体检平台web健康体检管理系统Java代码编写
springboot/ssm互联网智慧医院体检平台web健康体检管理系统Java代码编写 基于springboot(可改ssm)vue项目 开发语言:Java 框架:springboot/可改ssm vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库&am…...

介绍一下Mybatis的Executor执行器
Executor执行器是用来执行我们的具体的SQL操作的 有三种基本的Executor执行器: SimpleExecutor简单执行器 每执行一次update或select,就创建一个Statement对象,用完立刻关闭Statement对象 ReuseExecutor可重用执行器 可重复利用Statement…...

Wide Deep 模型:记忆能力与泛化能力
实验和完整代码 完整代码实现和jupyter运行:https://github.com/Myolive-Lin/RecSys--deep-learning-recommendation-system/tree/main 引言 Wide & Deep 模型是一种结合了线性模型(Wide)和深度神经网络(Deep)的混…...

Hot100之矩阵
73矩阵置零 题目 思路解析 收集0位置所在的行和列 然后该行全部初始化为0 该列全部初始化为0 代码 class Solution {public void setZeroes(int[][] matrix) {int m matrix.length;int n matrix[0].length;List<Integer> list1 new ArrayList<>();List<…...
Python语言的安全开发
Python语言的安全开发 引言 在信息技术迅速发展的今天,网络安全问题愈发凸显。随着Python语言的广泛应用,尤其是在数据分析、人工智能、Web开发等领域,其安全问题越来越受到重视。Python作为一门高效且易于学习的编程语言,虽然在…...

蓝桥杯刷题DAY3:Horner 法则 前缀和+差分数组 贪心
所谓刷题,最重要的就是细心 📌 题目描述 在 X 进制 中,每一数位的进制不固定。例如: 最低位 采用 2 进制,第二位 采用 10 进制,第三位 采用 8 进制, 则 X 进制数 321 的十进制值为ÿ…...

java项目验证码登录
1.依赖 导入hutool工具包用于创建验证码 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.5.2</version></dependency> 2.测试 生成一个验证码图片(生成的图片浏览器可…...

手写MVVM框架-环境搭建
项目使用 webpack 进行进行构建,初始化步骤如下: 1.创建npm项目执行npm init 一直下一步就行 2.安装webpack、webpack-cli、webpack-dev-server,html-webpack-plugin npm i -D webpack webpack-cli webpack-dev-server html-webpack-plugin 3.配置webpac…...

2025年2月2日(网络编程 tcp)
tcp 循环服务 import socketdef main():# 创建 socket# 绑定tcp_server socket.socket(socket.AF_INET, socket.SOCK_STREAM)tcp_server.bind(("", 8080))# socket 转变为被动tcp_server.listen(128)while True:# 产生专门为链接进来的客户端服务的 socketprint(&qu…...
【Docker项目实战】使用Docker部署MinIO对象存储(详细教程)
【Docker项目实战】使用Docker部署MinIO对象存储 前言一、 MinIO介绍1.1 MinIO简介1.2 主要特点1.3 主要使用场景二、本次实践规划2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本四、下载MinIO镜像五、…...

使用ollama本地部署Deepseek r1
1、下载ollama 在浏览器地址输入:https://ollama.com/ 选择windows版本的下载 2、安装ollama 3、运行ollama 安装完成后,打开命令行工具win r 在命令行输入:ollama 4、使用ollama下载并部署Deepseed r1 在ollama网站,下载…...

Unity飞行代码 超仿真 保姆级教程
本文使用Rigidbody控制飞机,基本不会穿模。 效果 飞行效果 这是一条优雅的广告 如果你也在开发飞机大战等类型的飞行游戏,欢迎在主页搜索博文并参考。 搜索词:Unity游戏(Assault空对地打击)开发。 脚本编写 首先是完整代码。 using System.Co…...
DeepSeek蒸馏模型:轻量化AI的演进与突破
目录 引言 一、知识蒸馏的技术逻辑与DeepSeek的实践 1.1 知识蒸馏的核心思想 1.2 DeepSeek的蒸馏架构设计 二、DeepSeek蒸馏模型的性能优势 2.1 效率与成本的革命性提升 2.2 性能保留的突破 2.3 场景适应性的扩展 三、应用场景与落地实践 3.1 智能客服系统的升级 3.2…...
使用 sunshine+moonlight 配置串流服务无法使用特殊键
最近了解到串流技术,使用的方案是 sunshine 为串流服务端,moonlight 为客户端,分别在 ipad,android,tv 端安装。 存在的问题 不管说什么平台都会有特殊键无法使用的问题,最初我发现在安卓电视,…...
5.角色基础移动
能帮到你的话,就给个赞吧 😘 文章目录 角色的xyz轴与移动方向拌合输入轴值add movement inputget controller rotationget right vectorget forward vector 发现模型的旋转改变后,xyz轴也会改变,所以需要旋转值来计算xyz轴方向。 …...

单细胞-第四节 多样本数据分析,下游画图
文件在单细胞\5_GC_py\1_single_cell\2_plots.Rmd 1.细胞数量条形图 rm(list ls()) library(Seurat) load("seu.obj.Rdata")dat as.data.frame(table(Idents(seu.obj))) dat$label paste(dat$Var1,dat$Freq,sep ":") head(dat) library(ggplot2) lib…...
Linux的循环,bash的循环
Linux的循环,bash的循环 在 Linux 系统中,Bash 循环是最常用的循环实现方式(Bash 是 Linux 默认的 Shell),但广义上“Linux 的循环”可能涉及其他 Shell 或编程语言的循环结构。以下是 Bash 循环的详细解析及其在 Linux 环境中的…...

【DeepSeek开发】Python实现股票数据可视化
代码: Github:Python实现股票数据可视化代码https://github.com/magolan2000/Data-visualization/tree/master 软件环境:PyCharm 2022.3.1 数据来源:akshare 最近DeepSeek可谓是热度不断,因此想评判一下DeepSeek的编程…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...

GraphRAG优化新思路-开源的ROGRAG框架
目前的如微软开源的GraphRAG的工作流程都较为复杂,难以孤立地评估各个组件的贡献,传统的检索方法在处理复杂推理任务时可能不够有效,特别是在需要理解实体间关系或多跳知识的情况下。先说结论,看完后感觉这个框架性能上不会比Grap…...

Linux入门课的思维导图
耗时两周,终于把慕课网上的Linux的基础入门课实操、总结完了! 第一次以Blog的形式做学习记录,过程很有意思,但也很耗时。 课程时长5h,涉及到很多专有名词,要去逐个查找,以前接触过的概念因为时…...