read input files, fastest way possible?

后端 未结 3 1215
甜味超标
甜味超标 2020-12-07 16:54

I have numerous text files of data in the form of float numbers. I\'m looking for the fastest way to read them in C++. I can change the file to binary if that\'s the fastest

3条回答
  •  悲哀的现实
    2020-12-07 17:52

    Having a binary file is the fastest option. Not only you can read it directly in an array with a raw istream::read in a single operation (which is very fast), but you can even map the file in memory if your OS supports it; you can use open/mmap on POSIX systems, CreateFile/CreateFileMapping/MapViewOfFile on Windows, or even the Boost cross-platform solution (thanks @Cory Nelson for pointing it out).

    Quick & dirty examples, assuming the file contains the raw representation of some floats:

    "Normal" read:

    #include 
    #include 
    
    // ...
    
    // Open the stream
    std::ifstream is("input.dat");
    // Determine the file length
    is.seekg(0, std::ios_base::end);
    std::size_t size=is.tellg();
    is.seekg(0, std::ios_base::beg);
    // Create a vector to store the data
    std::vector v(size/sizeof(float));
    // Load the data
    is.read((char*) &v[0], size);
    // Close the file
    is.close();
    

    Using shared memory:

    #include 
    #include 
    
    using boost::interprocess;
    
    // ....
    
    // Create the file mapping
    file_mapping fm("input.dat", read_only);
    // Map the file in memory
    mapped_region region(fm, read_only);
    // Get the address where the file has been mapped
    float * addr = (float *)region.get_address();
    std::size_t elements  = region.get_size()/sizeof(float);
    

提交回复
热议问题