【问题标题】:Is using lseek to extend a file guaranteed to create a sparse file正在使用 lseek 扩展文件,保证创建稀疏文件
【发布时间】:2012-12-17 11:42:36
【问题描述】:

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

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

【问题讨论】:

  • 我认为这是获得lseek 所需语义的一种显而易见的方法,但我相信它作为实现细节保持开放。

标签: c linux solaris sparse-matrix


【解决方案1】:

参考您的第二个问题:要测试文件是否(部分)是稀疏文件,您可以使用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");
}

...

【讨论】:

    【解决方案2】:

    手册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。

    【讨论】:

      猜你喜欢
      • 2014-10-03
      • 2017-06-02
      • 2011-04-30
      • 2022-06-16
      • 1970-01-01
      • 1970-01-01
      • 2018-08-03
      • 2011-03-13
      • 1970-01-01
      相关资源
      最近更新 更多