当前位置: 首页 > 面试题库 >

为什么mmap()在1TB稀疏文件上的ENOMEM失败?

边明煦
2023-03-14
问题内容

我一直在使用openSUSE 11.2
x86_64上的大型稀疏文件。当我尝试mmap()1TB的稀疏文件时,它因ENOMEM而失败。我本以为64位地址空间足以映射到TB级,但似乎还不够。进一步试验,一个1GB的文件可以正常工作,但是一个2GB的文件(以及更大的文件)会失败。我猜想可能有一个需要调整的地方,但是广泛的搜索没有任何效果。

这是一些显示问题的示例代码-有什么线索吗?

#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    char * filename = argv[1];
    int fd;
    off_t size = 1UL << 40; // 30 == 1GB, 40 == 1TB

    fd = open(filename, O_RDWR | O_CREAT | O_TRUNC, 0666);
    ftruncate(fd, size);
    printf("Created %ld byte sparse file\n", size);

    char * buffer = (char *)mmap(NULL, (size_t)size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if ( buffer == MAP_FAILED ) {
        perror("mmap");
        exit(1);
    }
    printf("Done mmap - returned 0x0%lx\n", (unsigned long)buffer);

    strcpy( buffer, "cafebabe" );
    printf("Wrote to start\n");

    strcpy( buffer + (size - 9), "deadbeef" );
    printf("Wrote to end\n");

    if ( munmap(buffer, (size_t)size) < 0 ) {
        perror("munmap");
        exit(1);
    }
    close(fd);

    return 0;
}

问题答案:

问题是每个进程的虚拟内存限制设置为仅1.7GB。ulimit-v1610612736将其设置为1.5TB,我的mmap()调用成功。谢谢bmargulies,提示您尝试ulimit-a!



 类似资料:
  • 问题内容: 我得到了一个1TB的稀疏文件,在Linux上实际上存储了32MB数据。 是否可以“有效地”制作一个软件包来存储稀疏文件?该软件包应解压缩为另一台计算机上的1TB稀疏文件。理想情况下,“软件包”应为32MB左右。 注意:可能的解决方案是使用“ tar”:https : //wiki.archlinux.org/index.php/Sparse_file#Archiving_with_.6

  • 问题内容: 我想将文件从一个地方复制到另一个地方,问题是我处理了很多稀疏文件。 有什么(简单的)复制稀疏文件而不会在目标位置变得庞大的方法? 我的基本代码: 问题答案: 一些背景理论 请注意,通过管道传输原始字节–一旦您认为将原始数据通过管道从到提供和的,就可以理解。这样,绝对可以处理提供字节的任何源以及使用它们的任何接收器。 另一方面,文件中漏洞的位置是“侧通道”信息,这些“侧通道”信息是“经典

  • 请看示例代码(注意 data 的数组下标): -- http://www.kyne.com.au/~mark/software/lua-cjson.php -- version: 2.1 devel local json = require("cjson") local data = {1, 2} data[1000] = 99 -- ... do the other things ngx.

  • 这个例子展示了如何使用 scikit-learn 中的单词包方法,根据主题对文档进行分类。本例使用scipy.sparse中的矩阵来存储特征,并演示各种能够有效处理稀疏矩阵的分类器。 本例中使用的数据集是20条新闻组数据集。通过scikit-learn可以自动下载该数据集,并进行缓存。 下述条形图展示了各个不同分类器,其信息包括精度、训练时间(已归一化)和测试时间(已归一化)。 import lo

  • 我正在网上寻找稀疏图的好定义,但我很困惑。稀疏图实际上是一个具有数百万/数十亿节点的大图吗?一个例子是现实世界的一个——比如Facebook。或者它们也可以在小型网络中? 提前感谢!

  • 问题内容: [编辑:此问题仅适用于32位系统。 如果您的计算机,操作系统和python实现是64位的,则映射大型文件将可靠且非常有效。] 我正在编写一个模块,该模块除其他功能外,还允许对文件进行按位读取访问。这些文件可能很大(数百GB),因此我编写了一个简单的类,使我可以像对待字符串一样对待文件,并隐藏所有查找和读取内容。 当时我写了包装类,我对mmap模块一无所知。在阅读mmap的文档时,我认为