У меня есть несколько .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 с)