ReadBigFile
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
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;
}
Please register or sign in to comment