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

标签 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;
}

我可以试验一下,看看哪种方法和哪种页面大小更快。但是,是否有另一种方法被认为是扩展文件的正常最佳实践?我应该对其他方法进行性能测试吗?

谢谢。

最佳答案

看看 posix_fallocate()功能:为文件保留空间,而不必写入任何数据占用该空间。分配的空间有点像一个稀疏文件,即使您没有明确写入任何内容,您也可以从中读取,但与稀疏文件不同的是,它实际上减少了文件系统中的可用空间量。您可以放心,以后可以写入文件的该区域而不会用完空间。

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

另请注意,并非所有文件系统驱动程序都支持 posix_fallocate() 利用的预分配功能,我认为它会退回到实际将数据写入文件(正常方式)如果不支持预分配。典型的 Linux 文件系统,如 ext4 和 XFS 是可以的,但如果你在 FAT 或 NTFS 之类的东西上尝试它,你的程序可能会在 I/O 上阻塞一段时间。

关于c - 从 C 可执行文件增加 ext4 文件系统上 linux 文件大小而不在文件中创建漏洞的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33139651/

相关文章:

c - 实现 UART 帧 Controller

c - 为什么来自 K&R 的某些代码在代码 :Blocks? 中不起作用

c - 你说它仍然会在后台运行一些东西

python - 如何理解gunicorn中的workers是如何被消耗的

java - 在数组中搜索特定字符串

c - 如何为函数内部的结构分配动态内存槽,可以从程序中的任何位置访问该结构

python - pysvn 1.6.3 可以在 linux 下与 Subversion 1.6 一起工作吗?

Linux readw 和 readl 字节顺序

c# - 比较 3 个不同列表计数的有效方法

android - 如何仅在我的应用程序中禁用声音?