2013-01-09 10 views
5

Tworzę plik wykonywalny C++ do scalania plików. Mam 43 pliki o rozmiarze 100 MB każdy. więc w sumie około 4,3 GB.Scalanie pliku bez spacji jest szybsze niż w przypadku przestrzeni

dwóch przypadkach:

One: Jeśli nazwa pliku to 1, 2, 3, 4, 5, 6, ..., 43 to trwa około 2 minut, aby zakończyć połączenia.

Po drugie: Jeśli nazwa pliku to This File.ova0, This File.ova1, ..., To File.ova42 zakończenie połączenia zajmie około 7 minut.

To jest ten sam dokładny plik, właśnie zmieniłem nazwę pliku. Masz pojęcie, co jest nie tak?

Jest to C++ kod

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

go uruchomić poprzez plik bat jak ten:

@ECHO OFF 

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

PAUSE 

lub

@ECHO OFF 

Combiner.exe 1 2 3 

PAUSE 

zarówno plik .bat idzie do końca nazwa pliku, właśnie napisałem 3 pliki tutaj, inaczej będzie zbyt długo

Dziękujemy

+1

Czy uruchomiłeś go kilka razy, aby upewnić się, że jest to zachowanie komandosów? – hmatar

+0

tak .. Uruchomę to prawie 10 razy każdy, i to mniej więcej w tym czasie. – Harts

+4

Ponieważ używasz C++, a nie C, lepiej być z 'fstream' niż' fopen'. – Foggzie

Odpowiedz

1

Domyślnie system Windows buforuje dane pliku, które są odczytywane z dysków i zapisywane na dyskach. Oznacza to, że operacje odczytu odczytują dane pliku z obszaru w pamięci systemowej znanego jako cache plików systemowych, a nie z dysku fizycznego. Odpowiednio, operacje zapisu zapisują dane pliku w pamięci podręcznej systemu, a nie na dysku, a ten typ pamięci podręcznej jest nazywany pamięcią podręczną zapisu. Buforowanie jest zarządzane dla obiektu pliku: Więcej informacji: File Caching

Powiązane problemy