写入NumPy memmap仍然会加载到RAM内存中

 梅花七 发布于 2023-02-08 19:14

我正在通过IPython Notebook测试NumPy的memmap,代码如下

Ymap = np.memmap('Y.dat', dtype='float32', mode='w+', shape=(5e6, 4e4))

如你所见,它Ymap的形状非常大.我试图Ymap像稀疏矩阵一样填满.我没有使用scipy.sparse矩阵,因为我最终需要用另一个密集矩阵对它进行点积,这绝对不适合内存.

无论如何,我正在执行一系列很长的索引操作:

Ymap = np.memmap('Y.dat', dtype='float32', mode='w+', shape=(5e6, 4e4))
with open("somefile.txt", 'rb') as somefile:
    for i in xrange(5e6):
        # Read a line
        line = somefile.readline()
        # For each token in the line, lookup its j value
        # Assign the value 1.0 to Ymap[i,j]
        for token in line.split():
            j = some_dictionary[token]
            Ymap[i,j] = 1.0

这些操作不知何故很快耗尽了我的RAM.我认为mem-mapping基本上是一个核心内容numpy.ndarray.我错了吗?为什么我的记忆力如此疯狂?

1 个回答
  • (非匿名)mmap是文件和RAM之间的链接,大致可以保证当RAM mmap已满时,数据将被分页到给定文件而不是交换磁盘/文件,当你msyncmunmap它时, RAM的整个区域被写入文件.操作系统通常遵循惰性策略.磁盘访问(或急切的RAM):只要数据适合,数据就会保留在内存中.这意味着具有大型mmaps的进程将占用尽可能多的RAM,然后将其余部分溢出到磁盘.

    所以你是对的,一个np.memmap数组是一个核外数组,但它是一个可以尽可能多地获取RAM缓存的数组.

    2023-02-08 19:17 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有