Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用lseek扩展文件是否保证创建稀疏文件_C_Linux_Solaris_Sparse Matrix - Fatal编程技术网

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

C 使用lseek扩展文件是否保证创建稀疏文件,c,linux,solaris,sparse-matrix,C,Linux,Solaris,Sparse Matrix,我一直在减少一个程序的内存占用,该程序使用了我一直在使用的几个大型阵列,通过使用文件映射。由于我不知道这些数组所需的大小,所以我高估了数组的大小,使其达到我知道数组无法达到的程度,然后将文件截断到我使用完数组后的最终大小。 幸运的是,我用来创建映射文件的代码(在本文底部)在我尝试过的每台机器上都创建了稀疏文件。如果没有,将出现磁盘空间问题 问题是:在映射之前调用lseek扩展文件是否保证创建稀疏文件,或者至少在任何合理的Linux发行版和Solaris上都可以依赖它来实现 还有什么方法可以检查创

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

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

关于第二个问题:要测试文件是否(部分)是稀疏文件,可以使用
stat()
命令

例如:

#包括
#包括
...
struct stat st={0};
int result=stat(“文件名”、&st);
如果(-1==结果)
perror(“stat()”);
其他的
{
printf(“大小/字节:%ld”,st.st_大小);/*“官方”大小(字节)*/
printf(“块大小/字节数:%ld”,st.st\U blksize);
printf(“块:%ld”,st.st_块);/*磁盘上实际的块数*/
如果(st.st\U尺寸>(st.st\U blksize*st.st\U块))
printf(“文件是(至少部分)稀疏文件”);
}
...
手册指定了在文件末尾以外搜索时的行为,但没有提到稀疏文件。因此,这取决于操作系统,尤其是所使用的文件系统

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

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.1MB。

我认为这是获得
lseek
所需语义的一种明显方式,但我相信它作为实现细节是开放的。