在Debian Linux中快速创建一个非常大的文件

nic*_*sip 1 c linux debian

我目前正在开展一个涉及将一个非常大的文件(大约6GB)从一个Linux服务器传输到另一个Linux服务器的项目.服务器在Debian Squeeze上运行.为了实现我的主要目标,我最初将文件的名称和大小发送到目标计算机,并创建一个空文件,用于存储我从源计算机逐步接收的数据块.我的问题是在我的服务器中创建一个6GB的文件需要太长时间.为了更清楚,我使用以下C例程来创建新文件:

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);

    }
}
Run Code Online (Sandbox Code Playgroud)

我使用Linux dd命令,因为我认为这将是创建空6GB文件的最快方法.但是,完成大约需要15分钟.有没有办法更快地创建空文件?我究竟做错了什么?

感谢您的时间.

真诚的,尼克

Has*_*kun 7

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


Som*_*ude 5

首先creat是文件,然后lseek是所需的结尾,还有write一个虚拟字节.创建任意大但稀疏文件的快速方法.


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

如果stat结构没有该st_blksize成员,那么大多数文件系统的块大小为4或8 kB.您可以使此缓冲区更大,但不能太大.实验和基准!

  • 由于其稀疏性,Bu不会预先保留磁盘空间.也许OP*希望*保留磁盘空间以避免在传输内容期间空间不足. (2认同)