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