使用lseek扩展文件保证创建稀疏文件

时间:2012-12-17 11:42:36

标签: c linux solaris sparse-matrix

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

问题是:在映射之前调用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);

2 个答案:

答案 0 :(得分: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");
}

...

答案 1 :(得分: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。