【发布时间】:2013-05-27 10:58:28
【问题描述】:
我目前正在从事一个项目,该项目涉及将一个非常大的文件(大约 6GB)从一台 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);
}
}
我使用 Linux dd 命令是因为我认为它是创建空 6GB 文件的最快方法。但是,大约需要 15 分钟才能完成。有没有办法更快地创建空文件?我做错了什么?
感谢您的宝贵时间。
真诚地, 尼克
【问题讨论】:
-
如果直接从命令行运行
dd,需要这么长时间吗? -
为什么要创建文件?如果您按顺序发送数据,只需继续附加到文件。
-
@Oli 我不能直接从命令行运行 dd,因为上面的例程是从我实现的 C 服务器调用的。
-
即使它不是连续的,只要你收到一个块,你所要做的就是打开文件,寻找块的位置,然后把它写在那里。它会根据需要稀疏地增长,当你拥有所有的块时,它就不会再稀疏了。
-
哦,
bs=1是您要求最差性能的方式,一次从用户空间向内核发送一个字节!