没有空格的合并文件比有空格的合并文件速度更快。

5
所以,我创建了一个用于合并文件的C++可执行文件。我有43个大小为100MB的文件,总共约4.3GB。
两种情况:
一:如果文件名为1、2、3、4、5、6、……、43,则大约需要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
既然您正在使用C++而不是C,那么使用fstream比使用fopen更为合适。 - Foggzie
3
为什么不使用已经可用的工具呢?复制"This File.ova"、"This File.ova1"和"This File.ova2"到"abc def.ova" - Adrien Plisson
1
那么这两个测试中的文件是否在同一个“位置”上?也就是说,您是否为测试重命名了文件,还是将它们复制到磁盘的另一部分?如果您复制了文件,那么可能是坏扇区……或者即将出现问题。 - Hogan
1
我测试了你上面的代码。两个版本(短名称和长名称)运行速度相同。你还是遇到了相同的行为吗? - Eduard Wirch
1
似乎是一个文件系统的特性。如果你使用古老的Windows,"长"文件名会被编码为更多的单个文件名...(http://www.win.tue.nl/~aeb/linux/fs/fat/fat-1.html) :) - Ferenc Deak
显示剩余9条评论
1个回答

1

默认情况下,Windows会缓存从磁盘读取和写入磁盘的文件数据。这意味着读操作从系统内存中的系统文件缓存区域而不是物理磁盘中读取文件数据。同样地,写操作将文件数据写入系统文件缓存而不是磁盘,这种类型的缓存被称为回写缓存。缓存是针对每个文件对象进行管理的: 更多信息:文件缓存


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接