如何在不加载整文件到内存时操作内存映射并最小化内存占用?
解决内存映射文件取对数时的内存占用问题
要避免一次性加载整个4.3GB文件到内存计算,核心思路是用内存映射文件存储计算结果,分块处理数据,这样每次只在内存中处理一小部分数据,大幅降低内存占用。
具体实现步骤:
- 创建与源文件同形状、同数据类型的内存映射文件,用于存储计算后的结果
cl - 分块遍历源内存映射文件
cc,对每一块执行log+1计算后写入cl的对应位置 - 后续对
cl的切片操作和cc一样,无需加载全部数据到内存
示例代码:
import numpy as np import psutil print(psutil.virtual_memory().available) # 初始可用内存 # 加载源内存映射文件 cc = np.memmap(r'data//cc.dat', mode='r', dtype=float) print(psutil.virtual_memory().available) # 仅占用少量内存 # 创建用于存储结果的内存映射文件,和cc同形状、同dtype cl = np.memmap(r'data//cl.dat', mode='w+', dtype=float, shape=cc.shape) # 设置分块大小,比如每次处理100MB左右的数据(根据你的内存情况调整) block_size = int(100 * 1024 * 1024 / cc.dtype.itemsize) # 按元素数计算块大小 # 分块处理 for i in range(0, cc.shape[0], block_size): end = min(i + block_size, cc.shape[0]) # 仅加载当前块到内存计算,结果直接写入cl的对应块 cl[i:end] = np.log(cc[i:end]) + 1 # 强制将缓存写入磁盘(可选,但确保数据写入完成) del cl # 重新以只读模式加载结果的内存映射文件 cl = np.memmap(r'data//cl.dat', mode='r', dtype=float) print(psutil.virtual_memory().available) # 内存占用仅为分块大小对应的内存
关键说明
- 分块大小可以根据你的可用内存灵活调整,可用内存充足就设大一点,反之则设小一点
- 计算过程中,内存只会保留当前处理的块数据,不会加载整个4.3GB文件
- 最终的
cl是内存映射文件,切片操作和cc一致,无需加载全部数据到内存
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

