在Python中如何使用NumPy memmap处理超大文件

陌静吖_5188

陌静吖_5188

2026-11-16

847人浏览

原创

np.memmap不能直接读取任意格式超大文件,因为它仅支持连续、同构、已知dtype和shape的二进制数据;对CSV、HDF5等需解析的格式会报错或乱码,且必须精确匹配字节数、offset与dtype。

在python中如何使用numpy memmap处理超大文件

为什么 np.memmap 不能直接读取任意格式的超大文件

np.memmap 不是万能加载器,它只认「连续、同构、已知 dtype 和 shape」的二进制数据。如果你手头是 CSV、HDF5、Parquet 或带 header 的日志文件,np.memmap 会直接报错或读出乱码——因为它跳过解析,只做裸字节映射。

常见错误现象:ValueError: cannot reshape array of size X into shape (A,B),本质是文件字节数 ≠ dtype.itemsize * A * B;或者读出来全是 0 或极大负数,大概率是 dtype 指定错了(比如把 np.float32 当成 np.float64)。

  • 必须提前知道:元素类型(dtype)、总长度或形状(shape)、是否含 header(影响 offset)
  • 原始文件得是 np.save 写出的 .npy,或用 np.ndarray.tofile() 保存的纯二进制,又或是你自己用 C/Python 控制字节顺序生成的
  • 若数据来自外部(如传感器采集),建议先用脚本预处理成 raw binary:剥离 header、统一字节序、验证 checksum

创建 memmap 时 mode 和 offset 怎么选

mode 决定你对文件的权限和缓存行为,不是“读写开关”那么简单。例如 mode='r' 是只读 + OS 页面缓存,而 mode='c'(copy-on-write)看似安全,但一旦修改就触发页复制,内存占用翻倍且不落盘——除非你明确需要临时修改不污染原文件。

offset 很容易被忽略:它单位是字节,不是元素个数。比如想跳过前 1024 字节的 header,且 dtype 是 np.float32(4 字节/元素),那后续 shape 就不能再按“从第 0 个元素开始”算。

  • 读已有数据:优先用 mode='r';需局部写入(如打标签)用 mode='r+';确定要覆盖原文件才用 mode='w+'
  • offset=1024 后,若想映射为 (1000, 500) 的 float32 数组,文件总长至少得是 1024 + 1000*500*4 = 2,001,024 字节
  • Windows 下打开已由其他进程锁定的文件会失败,此时换 mode='r' 并确认文件没被 Excel/记事本占用

用 memmap 做分块计算时,为何有时比普通 load() 还慢

memmap 的优势不在“一次全读”,而在“按需页加载 + 避免内存拷贝”。如果你写 arr[:] = some_computation(arr[:]),等于强制把整个数组调入物理内存,还多了一层 mmap 系统调用开销。

Python 环境工具专业版
Python 环境工具专业版

Python 环境工具专业版功能概述Python 环境工具专业版是一项面向实际任务的技能。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。核心要点使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。执行完成后建议检查结果是否符合预期,并保留必要记录。使用与执行同时注意输入完整性、执行条件和输出可用性。从功能定位来看,该技能

下载

真正高效的模式是:用小切片(slice)驱动计算,让 OS 按需换页,并配合 numpy.ndarray.flush() 控制写回时机。

  • 避免 arr.sum() 或 arr.mean() 全局聚合——改用循环分块:for i in range(0, len(arr), chunk_size): batch = arr[i:i+chunk_size]; result += f(batch)
  • 写入密集场景下,每处理完一个 chunk 调一次 arr.flush(),否则修改可能滞留在 page cache 中,程序崩溃就丢数据
  • Linux 上可配合 os.posix_fadvise(fd, offset, len, os.POSIX_FADV_DONTNEED) 提示内核释放不用的页,减少 swap 压力(需用 open() 获取 fd)

跨平台使用 memmap 的三个硬坑

Windows 和 Linux 对 mmap 的实现差异会导致同一份代码在不同系统上行为不一致,尤其涉及文件锁、共享内存和字节序。

最典型的错误:OSError: [Errno 22] Invalid argument —— 多半是 Windows 下尝试用 mode='c' 映射网络路径(SMB/NFS),或者文件被杀毒软件实时扫描锁定。

  • 路径必须用正斜杠或双反斜杠:r'C:\data\big.bin' 或 'C:/data/big.bin',单反斜杠会触发转义错误
  • 不要在 NFS/Samba 共享目录上用 memmap;如必须,改用 mode='r' + 客户端本地缓存
  • 不同平台默认字节序不同(x86 是 little-endian),如果文件由另一台机器生成,务必显式指定 dtype 带字节序,如 np.dtype('>f4') 表示 big-endian float32

memmap 真正省的是内存,不是开发时间——dtype 错一位、offset 少算一 byte、mode 选错场景,都可能让程序跑出完全不可预期的结果,而且问题往往延迟暴露。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1931

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

5464

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1889

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

33237

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3907

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3907

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1283

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

616

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

3043

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程