5

そこで、ファイルをマージするための C++ 実行可能ファイルを作成します。それぞれ100MBのサイズの43個のファイルがあります。合計で約4.3GB。

2 つのケース:

1: ファイル名が 1、2、3、4、5、6、...、43 の場合、マージが完了するまでに約 2 分かかります。

2: ファイル名が This File.ova0、This File.ova1、...、This File.ova42 の場合、マージが完了するまでに約 7 分かかります。

これはまったく同じファイルです。ファイルの名前を変更しただけです。何が問題なのですか?

これはC++コードです

#include <iostream>
#include <fstream>

#include <vector>
#include <string>

#include "boost/filesystem.hpp"

namespace bfs = boost::filesystem;

#pragma warning(disable : 4244)


typedef std::vector<std::string> FileVector;
int main(int argc, char **argv)
{

    int bucketSize = 3024 * 3024;

    FileVector Files;

    //Check all command-line params to see if they exist..
    for(int i = 1; i < argc; i++)
    {
        if(!bfs::exists(argv[i]))
        {
            std::cerr << "Failed to locate required part file: " << argv[i] << std::endl;
            return 1;
        }

        //Store this file and continue on..
        std::cout << "ADDING " << argv[i] << std::endl;
        Files.push_back(argv[i]);
    }

    //Prepare to combine all the files..
    FILE *FinalFile = fopen("abc def.ova", "ab");

    for(int i = 0; i < Files.size(); i++)
    {
        FILE *ThisFile = fopen(Files[i].c_str(), "rb");     

        char *dataBucket = new char[bucketSize];

        std::cout << "Combining " << Files[i].c_str() << "..." << std::endl;

        //Read the file in chucks so we do not chew up all the memory..
        while(long read_size = (fread(dataBucket, 1, bucketSize, ThisFile)))
        {
            //FILE *FinalFile = fopen("abc def.ova", "ab");
            //::fseek(FinalFile, 0, SEEK_END);
            fwrite(dataBucket, 1, read_size, FinalFile);
            //fclose(FinalFile);
        }

        delete [] dataBucket;
        fclose(ThisFile);
    }
    fclose(FinalFile);

    return 0;
}

次のように .bat ファイルを実行します。

@ECHO OFF

Combiner.exe "This File.ova0" "This File.ova1" "This File.ova2" 

PAUSE

また

@ECHO OFF

Combiner.exe 1 2 3

PAUSE

両方の .bat ファイルはファイル名の最後まで続きます。ここに 3 つのファイルを書きました。そうしないと、長すぎます。

ありがとうございました

4

1 に答える 1

1

既定では、Windows は、ディスクから読み取られ、ディスクに書き込まれるファイル データをキャッシュします。これは、読み取り操作が、物理ディスクからではなく、システム ファイル キャッシュと呼ばれるシステム メモリ内の領域からファイル データを読み取ることを意味します。これに対応して、書き込み操作は、ファイル データをディスクではなくシステム ファイル キャッシュに書き込みます。このタイプのキャッシュは、ライトバック キャッシュと呼ばれます。キャッシュはファイル オブジェクトごとに管理されます: 詳細情報:ファイル キャッシュ

于 2014-01-26T22:11:43.970 に答える