首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Debian Linux中快速创建超大文件

在Debian Linux中快速创建超大文件
EN

Stack Overflow用户
提问于 2013-05-27 18:58:29
回答 5查看 430关注 0票数 1

我目前正在做一个项目,涉及将一个非常大的文件(大约6 6GB)从一个Linux服务器传输到另一个服务器。服务器运行在Debian Squeeze上。为了实现我的主要目标,我首先将文件的名称和大小发送到目标机器,然后创建一个空文件来存储我逐渐从源机器接收到的数据块。我的问题是在我的服务器上创建一个6 6GB的文件需要花费太长的时间。为了清楚起见,我使用下面的C例程来创建新文件:

代码语言:javascript
复制
void create_file(char* f_name, long long f_size) {
    char* bs, *of, *s_f_size, *count;
    if((pid = fork()) < 0) {
            perror("fork() failed.");
            return;
    }
    if(pid == 0) {
        //Call execl
        of = (char*) malloc(sizeof(char)*(strlen("of=") + strlen(f_name) + 1));
        s_f_size = (char*) malloc(sizeof(char)*32);
        sprintf(s_f_size, "%lld", file_size);
        count = (char*) malloc(sizeof(char)*(strlen("count=") + strlen(s_f_size) + 1));
        strcpy(of, "of=");
        strcat(of, f_name);
        strcpy(count, "count=");
        strcat(count, s_f_size);
        ret = execl("/bin/dd", "dd", "if=/dev/zero", of, "bs=1", count, (char*) 0);
        if(ret < 0) {
            perror("execl() failed");
            free(s_f_size);
            free(of);
            free(count);
            return;
        }else {
            free(s_f_size);
            free(of);
            free(count);
            return;
        }
    }else {
        status = 0;
        wpid = wait(&status);

    }
}

我使用Linux dd命令,因为我认为这是创建一个空的6 6GB文件的最快方法。但是,它需要大约15分钟才能完成。有没有更快创建空文件的方法?我做错了什么?

谢谢您抽时间见我。

诚心的,尼克

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-05-27 19:01:10

首先creat文件,然后lseek到所需的末尾,然后write一个虚拟字节。非常快速的方法来创建一个任意大但sparse文件。

如果您不希望文件是稀疏的,那么找出驱动器的块大小(可以在大多数POSIX平台上使用stat找到)。创建一个该大小的缓冲区,并将其写入文件,直到需要的大小。

如果stat结构没有st_blksize成员,那么大多数文件系统的块大小都是4或8 kB。您可以将此缓冲区设置得更大,但不要太大。实验和基准测试!

票数 5
EN

Stack Overflow用户

发布于 2013-05-27 19:07:53

除了Joachim Pileborg的建议之外,您还可以使用posix_fallocate()为您的文件预先分配空间。

票数 7
EN

Stack Overflow用户

发布于 2013-05-27 19:13:08

如果您正在使用内核v2.6.31+并且文件系统支持它,请考虑使用fallocate

代码语言:javascript
复制
fallocate -l 6GB hugefile

It将数据块预分配给文件。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16771660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档