void tempMergeSort(edge_t * tA, edge_t * tB, int * iA, int * iB, int a, int b) { int m; if (b-a < 2) { return; } //only one element, so we're done m = (a+b)/2; tempMergeSort(tA, tB, iA, iB, a, m); //sort each half tempMergeSort(tA, tB, iA, iB, m, b); tempMerge(tA, tB, iA, iB, a, m, b); //then shuffle sorted for (m=a; m<b; m++) { //copy values back to A tA[m] = tB[m]; iA[m] = iB[m]; } }
/* * Recorre el directorio y procesa archivo por archivo del mismo */ void Parser::recorrerDirectorio(string dir, ofstream &paths, ofstream &offsets) { time_t start = time(0); ofstream docFile; string filepath; DIR *dp; struct dirent *dirp; struct stat filestat; vector<TerminoRegister> terminos; dp = opendir(dir.c_str()); if (dp == NULL) { cout << "Directorio inválido" << endl; return; } short nro_doc = 0; int memoriaUsada = 0; //Offset inicial: despues del header long offset = sizeof(short)+dir.length(); double seconds_since_start; vector<file_t> files; vector<file_t> tempFiles; while ((dirp = readdir(dp))) { filepath = dir + "/" + dirp->d_name; // Saltea subdirectorios if (stat(filepath.c_str(), &filestat)) { continue; } if (S_ISDIR(filestat.st_mode)) { continue; } //Identificacion de los documentos a indexar: guarda y numera documentos nro_doc++; file_t file; file.path = filepath; file.name = dirp->d_name; file.size = fileSize(filepath); files.push_back(file); } sort(files.begin(),files.end(),file_cmp); for(unsigned int i = 0; i< files.size(); i++) { //TODO: comprobar si se lleno la memoria, de ser asi, bajo a disco // if (memoriaUsada >= MAX_MEM) { files[i].nro = i+1; guardarDocumento(files[i].name,files[i].nro,paths,offsets,&offset); cout << files[i].nro << ") Procesando " + files[i].name << endl; this->processFile(files[i].path.c_str(), files[i].nro, &terminos, &memoriaUsada); //Ordeno la lista de terminos sort(terminos.begin(),terminos.end(),TerminoRegister::cmp); // TRAERME TERMINOS DE DISCO, JUNTARLOS CON LOS ACTUALES //vector<TerminoRegister> terminosFinal = procesarTerminos(&terminos); FileManager::guardarArchivoTemporal(terminos,repo_dir,i); file_t temp; temp.name = Utilidades::toString(i); temp.nro = i; temp.path = repo_dir + "/" + temp.name; temp.size = fileSize(temp.path); tempFiles.push_back(temp); //imprimirArchivoParcial(terminos); //guardarEnDisco(terminosFinal); terminos.clear(); // } } file_t temp1; file_t temp2; int counter = tempFiles.size(); while(tempFiles.size() > 1) { sort(tempFiles.begin(),tempFiles.end(),temp_file_cmp); temp1 = tempFiles.back(); tempFiles.pop_back(); temp2 = tempFiles.back(); tempFiles.pop_back(); cout << "**********MERGING "+ temp1.path + " - " + temp2.path + " en " << counter << " ********************"<< endl; tempFiles.push_back(tempMerge(temp1,temp2,repo_dir + "/" + Utilidades::toString(counter))); // cout << " FIN DE MERGE" << endl; remove(temp1.path.c_str()); remove(temp2.path.c_str()); counter++; } ifstream archivoFinal(tempFiles.front().path.c_str(),ios::in|ios::binary); ofstream tIdxOut((repo_dir + "/terminosIdx").c_str(),ios::binary|ios::out); ofstream tListaOut((repo_dir + "/terminosLista").c_str(),ios::binary|ios::out); ofstream tLexicoOut((repo_dir + "/lexico").c_str(),ios::binary|ios::out); ofstream tDocsOut(( repo_dir + "/documentos").c_str(),ios::binary|ios::out); cout << "************INDEXANDO Y GUARDANDO EN DISCO*******************" << endl; procesarTerminos(archivoFinal,tIdxOut,tListaOut,tLexicoOut,tDocsOut); //VACIO EL BUFFER DE DOCUMENTOS ByteBuffer::getInstance()->vaciar(tDocsOut); IndexManager::getInstance()->reset(); terminos.clear(); cout << "************GUARDADO EN DISCO*******************" << endl; tIdxOut.close(); tListaOut.close(); tLexicoOut.close(); tDocsOut.close(); archivoFinal.close(); remove(tempFiles.front().path.c_str()); //guardarEnDisco(terminosFinal); // seconds_since_start = difftime( time(0), start); // cout << seconds_since_start/60 << endl; // // PARA EL ULTIMO // //Ordeno la lista de terminos // sort(terminos.begin(),terminos.end(),TerminoRegister::cmp); // // vector<TerminoRegister> terminosFinal = procesarTerminos(&terminos); // //imprimirArchivoParcial(terminos); // guardarEnDisco(terminosFinal); closedir(dp); }