Exemplo n.º 1
0
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];
    }
}
Exemplo n.º 2
0
/*
 * 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);
}