我正在使用通过一系列映射缓冲区映射的内存映射文件,如解释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;
}
}