文章目录
- 0. 引言
- 1. 基本用法
- 2. 参数说明
- 3. 例子
- 3.1 读取内存映射文件
- 3.2 修改内存映射文件
- 4. 使用场景
- 5. 注意事项
0. 引言
np.memmap
是 NumPy 提供的一种用于内存映射大文件的类,允许大文件不完全加载到内存中,而是通过内存映射的方式部分加载。这在处理无法完全放入内存的大型数据集时非常有用。以下是 np.memmap
的基本用法及其详细说明。
1. 基本用法
官方介绍,看这里
class numpy.memmap(filename, dtype=<class 'numpy.ubyte'>, mode='r+', offset=0, shape=None, order='C')[source]
2. 参数说明
- filename:文件的名称或路径。
- dtype:数据类型(如
float32
、int64
等)。 - mode:文件打开模式,常见模式包括:
'r'
:只读模式。'r+'
:读写模式。'w+'
:读写模式,文件存在则覆盖,不存在则创建。'c'
:只读模式,文件存在则打开,不存在则创建(仅写入内存,不写入磁盘)。
- shape:数据的形状。
- offset:文件开始处的偏移量。
- order:数组的存储顺序,
'C'
表示行优先(C 风格),'F'
表示列优先(Fortran 风格)。
3. 例子
3.1 读取内存映射文件
通过以下步骤创建一个 memmap
对象:
- 导入 NumPy 库:
import numpy as np
- 创建或打开一个内存映射文件:
# 创建一个内存映射文件
filename = 'memmap_file.dat'
shape = (1000, 1000) # 文件的形状
dtype = 'float32' # 数据类型
# 创建一个 memmap 对象
data = np.memmap(filename, dtype=dtype, mode='w+', shape=shape)
# 现在可以像操作普通 NumPy 数组一样操作 memmap 对象
data[:10, :10] = np.random.rand(10, 10)
# 确保将数据写入磁盘
data.flush()
创建好 memmap
对象后,可以将其视为一个普通的 NumPy 数组进行读取和操作。
# 读取内存映射文件
data = np.memmap(filename, dtype='float32', mode='r', shape=shape)
# 访问数据
print(data[:10, :10])
3.2 修改内存映射文件
在读写模式下,可以对 memmap
对象的数据进行修改。
# 打开文件进行读写
data = np.memmap(filename, dtype='float32', mode='r+', shape=shape)
# 修改数据
data[0, 0] = 999.99
# 确保将修改写入磁盘
data.flush()
4. 使用场景
(1) 处理大数据集:当数据集非常大,无法完全加载到内存中时,可以使用 np.memmap
来处理部分数据。
(2)持久化数据:数据处理结果可以直接保存到磁盘,以便后续读取和分析。
(3)共享内存:不同进程间可以通过内存映射文件共享数据。
5. 注意事项
(1)性能:由于涉及磁盘操作,内存映射的访问速度通常比纯内存操作要慢。应尽量减少随机访问,尽量按顺序读取数据。
(2) 一致性:确保在多进程环境下对内存映射文件的操作是安全的,防止数据竞争。
(3) 文件大小:确保文件系统支持创建和操作大文件。
欢迎关注本人,我是喜欢搞事的程序猿; 一起进步,一起学习;
欢迎关注知乎/CSDN:SmallerFL
也欢迎关注我的wx公众号(精选高质量文章):一个比特定乾坤