Numpy: np.memmap详细用法


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:数据类型(如 float32int64 等)。
  • mode:文件打开模式,常见模式包括:
    • 'r':只读模式。
    • 'r+':读写模式。
    • 'w+':读写模式,文件存在则覆盖,不存在则创建。
    • 'c':只读模式,文件存在则打开,不存在则创建(仅写入内存,不写入磁盘)。
  • shape:数据的形状。
  • offset:文件开始处的偏移量。
  • order:数组的存储顺序,'C' 表示行优先(C 风格),'F' 表示列优先(Fortran 风格)。

3. 例子

3.1 读取内存映射文件

通过以下步骤创建一个 memmap 对象:

  1. 导入 NumPy 库
import numpy as np
  1. 创建或打开一个内存映射文件
# 创建一个内存映射文件
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公众号(精选高质量文章):一个比特定乾坤
在这里插入图片描述

np.memmapnumpy库中的一个函数,用于创建一个内存映射文件。通过内存映射文件,可以将一个大型数组存储在磁盘上,但是可以像操作内存中的数组一样对其进行访问和操作。\[1\] 使用np.memmap函数可以创建一个内存映射文件,并将数据写入其中。可以指定文件路径、数据类型、打开模式和数组的形状。例如,可以使用np.memmap创建一个内存映射文件,并将数据写入其中:\[1\] ```python import numpy as np data = np.array(\[1, 2, 3, 4, 5\]) fp = np.memmap('your/file/path/xxx.npy', dtype='your_dtype', mode='w+', shape=your_shape) fp\[:\] = data\[:\] ``` 可以通过指定偏移量和元素的形状来读取内存映射文件中的数据。例如,可以使用np.memmap创建一个内存映射文件,并通过偏移量和元素的形状来读取数据:\[1\] ```python import numpy as np ele = np.memmap('your/file/path/xxx.npy', dtype='your_dtype', mode='r', shape=your_ele_shape, offset=index*your_ele_shape*byte_of_dtype) ``` np.memmap函数的默认文件打开方式是'r+',即可读可写。可以通过指定mode参数来修改文件打开方式。\[2\] 总之,np.memmapnumpy库中用于创建内存映射文件的函数,可以方便地对大型数组进行读写操作。它在处理特别大的数组时非常有用,可以将数据存储在磁盘上,同时可以像操作内存中的数组一样对其进行访问和操作。\[3\] #### 引用[.reference_title] - *1* [python numpy.memmap](https://blog.csdn.net/qq_35898332/article/details/126270386)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [np.memmap读取大文件](https://blog.csdn.net/dejing6575/article/details/101474251)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SmallerFL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值