Skip to content
Snippets Groups Projects

ReadBigFile

  • Clone with SSH
  • Clone with HTTPS
  • Embed
  • Share
    The snippet can be accessed without any authentication.
    Authored by Mohcine Chraibi
    • Compile
    g++-8 main.cpp -std=c++17 -lstdc++fs
    • Run
    ./a.out traj1.xml
    Edited
    main.cpp 1.59 KiB
    #include <iostream>
    #include <fstream>
    #include <filesystem>
    #include <chrono>
    #include <string>
    namespace fs = std::filesystem;
    
    
    std::string readFile(fs::path path)
    {
        // Open the stream to 'lock' the file.
        std::ifstream f{ path };
    
        // Obtain the size of the file.
        const auto sz = fs::file_size(path);
    
        // Create a buffer.
        std::string result(sz, ' ');
    
        // Read the whole file into the buffer.
        f.read(result.data(), sz);
    
        return result;
    }
    
    int main(int argc, char * argv[])
    {
    
         auto  filename = argv[0];
    
    
         std::ifstream bigFile(filename);
         const auto MB = 1024 * 1024;
         constexpr size_t bufferSize = 100 * MB;
         std::unique_ptr<char[]> buffer(new char[bufferSize]);
    
         fs::path p = "traj.xml";
         std::cout << "File size = " << fs::file_size(p)/MB << " MB" << '\n';
    
         auto start = std::chrono::high_resolution_clock::now();
         std::string str;
    
         while (bigFile)
         {
              bigFile.read(buffer.get(), bufferSize);
              str = buffer.get();
              // process data in buffer
    //    std::cout << buffer << "\n---\n"
         }
         auto end = std::chrono::high_resolution_clock::now();
         std::chrono::duration<double> diff = end-start;
         std::cout << "Time to read in chunks: "
                   << diff.count() << " s\n";
    
         start = std::chrono::high_resolution_clock::now();
         readFile(p);
         end = std::chrono::high_resolution_clock::now();
         auto diff1 = end-start;
         std::cout << "Time to read in whole: "
                   << diff1.count() << " s\n";
    
         std::cout << "diff1/diff: " << diff1 / diff << "\n";
    
    
         return 0;
    
    }
    0% Loading or .
    You are about to add 0 people to the discussion. Proceed with caution.
    Please register or to comment