You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不加载整文件到内存时操作内存映射并最小化内存占用?

解决内存映射文件取对数时的内存占用问题

要避免一次性加载整个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 10:36:56