1

現在、非常に大きなファイル (約 6 GB) をある Linux サーバーから別のサーバーに転送するプロジェクトに取り組んでいます。サーバーは Debian Squeeze で実行されます。主な目標を達成するために、最初にファイルの名前とサイズを宛先マシンに送信し、ソース マシンから段階的に受信するデータ ブロックを格納するための空のファイルを作成します。私の問題は、サーバーで 6 GB のファイルの作成に時間がかかりすぎることです。より明確にするために、次の 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 コマンドを使用したのは、6 GB の空のファイルを作成する最も簡単な方法だと考えたからです。ただし、完了するまでに約 15 分かかります。空のファイルをより速く作成する方法はありますか? 私は何を間違っていますか?

お時間をいただきありがとうございます。

ニック

4

5 に答える 5

7

Joachim Pileborg が提案したことに加えてposix_fallocate()、ファイルのスペースを事前に割り当てるために使用することもできます。

于 2013-05-27T11:07:52.530 に答える
5

最初creatにファイル、次にlseek目的の末尾、およびwriteダミー バイト。任意の大きいがまばらなファイルを作成するための非常に迅速な方法。


ファイルをまばらにしたくない場合は、ドライブのブロック サイズを調べます (statほとんどの POSIX プラットフォームで を使用して調べることができます)。そのサイズのバッファを作成し、必要なサイズになるまでファイルに書き込みます。

stat構造体にメンバーがない場合、st_blksizeほとんどのファイルシステムのブロックサイズは 4 または 8 kB です。おそらくこのバッファを大きくすることはできますが、大きすぎないようにしてください。実験とベンチマーク!

于 2013-05-27T11:01:10.207 に答える
0

空のファイルを作成するためにopenシステムコールを使用したことを覚えています。次に、データをファイルにダンプします。部分的なデータ書き込みの場合は、位置をシークし、そこからダンプします。ファイルが存在する場合は、そのファイルを使用してデータを上書きします。

パフォーマンスに関しては、このアプローチは非常に優れていました。

于 2013-05-27T11:05:14.270 に答える