如何提高文件读取速度?

时间:2019-03-18 17:59:53

标签: c++ visual-studio performance optimization istream

我在代码中读取了多个.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)

(我写了第一个Port的值,所以您可以更好地理解)

由于.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;
    }
}

此代码可以按我的意愿工作,但是我有2GB的文件,每个.tsv都有8000至25000行。我花了30分钟时间执行代码并生成我想要的Excel。

我不再需要使用此代码,但是如何提高方法的速度?

35000行= 16,500 ms现在(16s)

0 个答案:

没有答案