2

我一直在通过使用文件映射来减少使用我一直在处理的几个大型数组的程序的内存占用。由于我不知道这些数组的所需大小,我将大小高估到我知道数组无法达到的水平,然后将文件截断到最终大小,我完成了数组。幸运的是,我用来创建映射文件的代码(在这篇文章的底部)在我尝试过的每台机器上创建了稀疏文件。如果没有,那就是磁盘空间问题。

问题是:在映射之前调用 lseek 来扩展文件可以保证创建一个稀疏文件,或者至少可以依靠任何合理的 Linux 发行版以及 Solaris 来做到这一点。

还有什么方法可以检查创建的文件是否稀疏,因为退出可能比尝试创建数百 GB 的非稀疏文件更好。

output_data_file_handle = open(output_file_name,O_RDWR | O_CREAT ,0600);
lseek(output_data_file_handle,output_file_size,SEEK_SET);
write(output_data_file_handle, "", 1);
void * ttv = mmap(0,(size_t)output_file_size,PROT_WRITE | PROT_READ, MAP_SHARED,output_data_file_handle,0);
4

2 回答 2

4

参考您的第二个问题:要测试文件是否(部分)是稀疏文件,您可以使用该stat()命令。

例子:

#include <stdio.h>
#include <sys/stat.h>

...

struct stat st = {0};

int result = stat("filename", &st);
if (-1 == result)
  perror("stat()");
else
{
  printf("size/bytes: %ld", st.st_size); /* 'official' size in bytes */
  printf("block size/bytes: %ld", st.st_blksize);
  printf("blocks: %ld", st.st_blocks); /* number of blocks actually on disk */

  if (st.st_size > (st.st_blksize * st.st_blocks))  
       printf("file is (at least partially) a sparse file");
}

...
于 2012-12-17T12:08:08.133 回答
4

该手册lseek指定了在文件末尾之外搜索时的行为,但没有提到稀疏文件。所以它取决于操作系统,尤其是使用的文件系统。

要测试,是否可以在系统上创建稀疏文件,您可以

dd if=/dev/zero of=/path/to/sparse.txt bs=1k seek=1024 count=1
du /path/to/sparse.txt

这会跳过 1024 个 1k 块,然后写入 1024 个字节。du如果它是一个稀疏文件,应该只显示几 kB,如果不是,大约 1.1 MB。

于 2012-12-17T12:23:15.480 回答