为什么我可以拥有比我的硬盘容量大得多的mmap文件?如果有的话,它什么时候会吹?

问题描述 投票:0回答:0

我正在使用通过一系列映射缓冲区映射的内存映射文件,如解释here。基本上,您创建一个文件并使用偏移量对该文件的大量段进行内存映射,使其成为一个非常大的文件。但我无法理解你不能凭空存储位这一事实。当我只有 261G 的可用硬盘空间时,我如何拥有一个可能有 1.5T 大小的文件?当我添加超过硬盘限制的数据时,它最终会导致我的机器崩溃和/或给我的程序一个异常吗? 当操作系统无法接受/存储时,允许分配 1.5T 的文件感觉不对。 见下文:

$ ls -lah
total 12K
drwxrwxr-x  2 root root 4.0K May 18 12:26 .
drwxrwxr-x 11 root root 4.0K May 18 09:23 ..
-rw-rw-r--  1 root root 1.5T May 18 12:26 myHugeFile.mmap

$ df -kh
Filesystem      Size  Used Avail Use% Mounted on
udev            7.8G     0  7.8G   0% /dev
tmpfs           1.6G  1.1M  1.6G   1% /run
/dev/sda5       438G  155G  261G  38% /
tmpfs           7.8G     0  7.8G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           7.8G     0  7.8G   0% /sys/fs/cgroup
/dev/sda1       1.9G  116M  1.7G   7% /boot
tmpfs           1.6G     0  1.6G   0% /run/user/1001

下面是 Java 代码,只是为了额外的上下文,它通过使用偏移量 (MAPPING_SIZE = 1Gbyte) 在同一文件之上分配大量内存映射文件(每个文件有 1Gb)。

public LargeDoubleMatrix(String filename, int width, int height) throws IOException {
    this.raf = new RandomAccessFile(filename, "rw");
    try {
        this.width = width;
        this.height = height;
        long size = 8L * width * height;
        for (long offset = 0; offset < size; offset += MAPPING_SIZE) {
            long size2 = Math.min(size - offset, MAPPING_SIZE);
            mappings.add(raf.getChannel().map(FileChannel.MapMode.READ_WRITE, offset, size2));
        }
    } catch (IOException e) {
        raf.close();
        throw e;
    }
}
java real-time mmap memory-mapped-files chronicle
© www.soinside.com 2019 - 2024. All rights reserved.