2013-01-09 5 views
5

So, ich erstelle eine ausführbare C++ - Datei zum Zusammenführen von Dateien. Ich habe 43 Dateien mit einer Größe von jeweils 100MB. also insgesamt ca. 4,3GB.Das Zusammenführen von Dateien ohne Leerzeichen ist schneller als mit Leerzeichen

Zwei Fälle:

One: Wenn der Dateiname ist 1, 2, 3, 4, 5, 6, ..., 43 ca. 2 Minuten dauern Fusion zu beenden.

Zwei: Wenn der Dateiname This File.ova0, This File.ova1, ..., This File.ova42 ist, dauert es etwa 7 Minuten, um die Zusammenführung zu beenden.

Dies ist die gleiche genaue Datei, ich umbenenne die Datei. Irgendeine Idee, was ist los?

Dies ist der C++ Code

#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; 
} 

ich es durch .bat Datei wie folgt ausgeführt werden:

@ECHO OFF 

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

PAUSE 

oder

@ECHO OFF 

Combiner.exe 1 2 3 

PAUSE 

beide .bat-Datei bis zum Ende geht von Dateiname, ich habe gerade 3 Dateien hier geschrieben, sonst wird es zu lang sein

Vielen Dank

+1

Haben Sie mehrmals ausgeführt, um sicherzustellen, dass dies das Comman-Verhalten ist? – hmatar

+0

ja .. Ich laufe es fast 10 mal, und das ist ungefähr die Zeit, die ich bekomme. – Harts

+4

Da Sie C++ und nicht C verwenden, wäre es besser mit 'fstream' als' fopen'. – Foggzie

Antwort

1

Standardmäßig zwischenspeichert Windows Dateidaten, die von Datenträgern gelesen und auf Datenträger geschrieben werden. Dies bedeutet, dass Leseoperationen Dateidaten aus einem Bereich im Systemspeicher lesen, der als Systemdateicache und nicht von der physischen Festplatte bekannt ist. Entsprechend schreiben Schreiboperationen Dateidaten in den Systemdateicache und nicht auf die Platte, und diese Art von Cache wird als Write-Back-Cache bezeichnet. Caching wird pro Dateiobjekt verwaltet: Weitere Informationen: File Caching

Verwandte Themen