Как я могу улучшить скорость чтения файлов? - PullRequest
0 голосов
/ 18 марта 2019

У меня есть несколько .tsv, которые я читаю в моем коде.Каждая строка выглядит следующим образом:

3   Port 10: NDI-MF2 Channel:0  3578848 1   OK  0,4881701   0,5157377   -0,5017654  -0,4938989  195,342 -5,154  -394,990    0,9763672   0   Port 11: NDI-MF2 Channel:0  3578848 1   OK  0,1504364   0,9189614   0,2268636   -0,2853273  -93,299 -107,491    -299,260    0,9993857   0   Port 12: NDI-MF2 Channel:0  3578848 1   OK  0,0572628   0,7722947   0,5232752   -0,3556190  -107,537    -121,891    -289,059    0,6039713   0

Как видите, в каждой строке у меня есть данные для 3 портов.Первое число - это количество портов, которые у меня есть.

Затем я собираю:

  • Название модели (например, порт 10: канал NDI-MF2: 0).
  • Кадр (3578848)
  • Лицо (1)
  • Состояние (ОК)
  • R0 (0,4881701)
  • RX (0,5157377)
  • RY (-0,5017654)
  • RZ (-0,4938989)
  • TX (195,342)
  • TY (-5,154)
  • TZ(-394,990)
  • Ошибка (0,9763672)
  • Маркеры (0)

(я написал значения первого порта, чтобы вы могли лучше понять)

Поскольку у меня есть несколько строк в .tsv, я написал этот код, чтобы прочитать его.

bool ProcesarDatos::LeerSigLineaValores(vector <TipoInformacion> *infoModelos, vector<TipoCoordenadas> *infoCoordenadas, double timestamp) {

infoModelos->clear();
infoCoordenadas->clear();


if (fichero.good()) {
    char Linea[700];
    LeerLinea(Linea, 700);

    string NTools, Model, Frame, Face, State, Rz, Ry, Rx, Tx, Ty, Tz, Error, Markers;
    string cadena(Linea);
    if (cadena.size() == 0) return false;


    istringstream divLinea(cadena);
    getline(divLinea, NTools, '\t');

    HerramientasDetectadas = stoi(NTools.c_str());
    if (HerramientasDetectadas != 3) return false;

        for (int j = 0; j < HerramientasDetectadas; j++) {
            TipoInformacion nuevoModelo;

            TipoCoordenadas nuevasCoordenadas;


            getline(divLinea, Model, '\t');
            nuevoModelo.ModelName = new char[strlen(Model.c_str()) + 1];
            strcpy(nuevoModelo.ModelName, Model.c_str());
            getline(divLinea, Frame, '\t');
            nuevoModelo.Frame = new char[strlen(Frame.c_str()) + 1];
            strcpy(nuevoModelo.Frame, Frame.c_str());
            getline(divLinea, Face, '\t');
            nuevoModelo.Face = new char[strlen(Face.c_str()) + 1];
            strcpy(nuevoModelo.Face, Face.c_str());


            getline(divLinea, State, '\t');

            nuevasCoordenadas.state = new char[strlen(State.c_str()) + 1];
            strcpy(nuevasCoordenadas.state, State.c_str());
            getline(divLinea, Rx, '\t'); //Here I lose R0 intentionally.
            getline(divLinea, Rx, '\t');
            nuevasCoordenadas.Rx = stringtoDouble(Rx);
            getline(divLinea, Ry, '\t');
            nuevasCoordenadas.Ry = stringtoDouble(Ry);
            getline(divLinea, Rz, '\t');
            nuevasCoordenadas.Rz = stringtoDouble(Rz);
            getline(divLinea, Tx, '\t');
            nuevasCoordenadas.Tx = stringtoDouble(Tx);
            getline(divLinea, Ty, '\t');
            nuevasCoordenadas.Ty = stringtoDouble(Ty);
            getline(divLinea, Tz, '\t');
            nuevasCoordenadas.Tz = stringtoDouble(Tz);
            getline(divLinea, Error, '\t');
            nuevasCoordenadas.errorValue = stringtoDouble(Error);
            getline(divLinea, Markers, '\t');
            nuevasCoordenadas.marker = stoi(Markers);

            nuevasCoordenadas.Time = timestamp;

            infoModelos->push_back(nuevoModelo);
            infoCoordenadas->push_back(nuevasCoordenadas);
        }
        return true;
    }
    else {
        cout << "\t File not good" << endl;
        return false;
    }
}

Хорошо, этот код работает, как я хотел, но у меня 2 ГБ файлов икаждый .tsv имеет от 8000 до 25000 строк.Мне потребовалось 30 минут, чтобы выполнить код и сгенерировать тот иск, который я искал.

Мне больше не нужно использовать этот код, но как я могу увеличить скорость метода?

35000 строк = 16 500 мс Прямо сейчас (16 с)

...