在C可执行文件中增加ext4文件系统中linux文件大小而不在文件中创建漏洞的最快方法是什么?

时间:2015-10-15 03:59:23

标签: c linux performance ext4

增加文件大小的最快方法是将ftruncate()或lseek()调整为所需大小并写入单个字节。在这种情况下,这不符合我的需要,因为文件中产生的漏洞不会在文件系统中保留空间。

是使用calloc()和write()的最佳替代方法吗?

int increase_file_size_(int fd, int pages) {
    int pagesize = 4096;
    void* data = calloc(pagesize, 1);
    for(int i = 0; i < pages; ++i) {
       // In a real world program this would handle partial writes and interruptions
       if (write(fd, data, pagesize) != pagesize) {
          return -1;
    }
    return 0;
}

使用writev可能会更快。 下一个版本应该更快,因为calloc必须初始化更少的内存,并且更多的数据适合CPU缓存。

int increase_file_size_(int fd, int pages) {
    int pagesize = 4096/16;
    void* data = calloc(pagesize, 1);
    struct iovec iov[16];
    for(int i = 0; i < 16; ++i) {
      iov[i].iov_base = data;
      iov[i].iov_len = pagesize ;
    }
    for(int i = 0; i < pages; ++i) {
       // In a real world program this would handle partial writes and interruptions
       if (writev(fd, data, pagesize) != pagesize * 16) {
          return -1;
    }
    return 0;
}

我可以尝试看看这些方法中的哪一种以及哪种页面大小更快。但是,是否有另一种方法被认为是扩展文件的正常最佳做法?还有其他方法我应该进行性能测试吗?

谢谢。

1 个答案:

答案 0 :(得分:2)

查看posix_fallocate()函数:它为文件保留空间,而不必写入任何数据来占用该空间。分配的空间有点像稀疏文件,即使您没有明确地向其中写入任何内容,您也可以从中读取它,但与稀疏文件不同,它实际上减少了文件系统中的可用空间量。您确信以后可以在不用空间的情况下写入该文件的该区域。

请注意,如果您在写入之前阅读它,posix_fallocate()似乎无法保证所分配空间的内容。我认为Linux实现将返回所有零字节,类似于稀疏文件,但您可能不应该依赖它。在你写一些真实的东西之前把它当作垃圾。

另请注意,并非所有文件系统驱动程序都支持posix_fallocate()利用的预分配功能,而且如果预分配不是&#,我认为它会依赖于实际将数据写入文件(正常方式) 39;支持。典型的Linux文件系统如ext4和XFS都可以,但如果你尝试使用FAT或NTFS这样的程序,你的程序可能会在I / O上暂时阻塞一段时间。