Как использовать mmap для целочисленного ввода? - PullRequest
0 голосов
/ 18 января 2020

Я кодировал программу, которая использует mmap в качестве входных данных для заполнения целочисленного 2D-вектора из файла .txt . Код является частью более крупной программы и будет представлен на конкурс. Есть ли способ повысить скорость с помощью mmap или другим способом? Вот код:

#include <fstream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <iostream>
// for mmap:
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
using namespace std;
const char* map_file(const char* fname, size_t& length);
int main()
{
     auto start = std::chrono::high_resolution_clock::now();
    size_t length;
       auto f = map_file("erasmus.in", length);
    auto l = f + length;


    int i = 0;
    bool flag = false;

    string lines;
    vector<vector<int> > students(10000); //The number of lines is predefined
    const char* temp;

    while (f && f!=l) {

         string element = "";
        temp = static_cast<const char*>(memchr(f, '\n', l-f));

        for(f = f;  f<=temp; f++)
        {
            if(!isspace(*f))
            {
                element += *f;
                flag = true;
            }
            if(isspace(*f) && flag == true)
            {
                flag = false;
               int assigned_element = stoi(element);
               students[i].push_back(assigned_element);
               element = "";
            }



        }
        i++;
        temp++;
    }






    auto finish = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double> elapsed1 = finish - start;


    FILE* output = fopen("erasmus.out", "w");
    for (int i = 0; i < students.size(); i++)
    {
        for (int j = 0; j < students[i].size(); j++)
        {
            fprintf(output, "%d ", students[i][j]);
        }
        fprintf(output, "\n");

    }
    std::cout << "Elapsed time: " << elapsed1.count() << " s\n";

    return 0;

}


void handle_error(const char* msg) {
    perror(msg);
    exit(255);
}

const char* map_file(const char* directory, size_t& length)
{
    int fileDirectory = open(directory, O_RDONLY);
    if (fileDirectory == -1)
        handle_error("open");

    // obtain file size
    struct stat sb;
    if (fstat(fileDirectory, &sb) == -1)
        handle_error("fstat");

    length = sb.st_size;

    const char* map = static_cast<const char*>(mmap(NULL, length, PROT_READ, MAP_PRIVATE, fileDirectory, 0u));
    if (map == MAP_FAILED)
        handle_error("mmap");

    return map;
}

Файл будет выполнен в системе linux, если это поможет найти оптимальный ответ. В конце каждой строки .txt есть пробел ('') и символ новой строки ('\ n')

...