示例#1
0
    def _write_multiencode_stats(self, term, ftype, etype, numbers):
        '''Escribe estadísticas de codificación de postings.

        Args:
            term (string): término al que corresponde la lista de números.
            ftype (PostingFieldTypes): tipo de archivo de stats a escribir
                (docs o freqs).
            etype (EncodeTypes): codificación utilizada.
            numbers (int list): números escritos con la codificación dado.
        '''
        writer = None

        if ftype == PostingFieldTypes.Docs:
            writer = self._multiencode_stats_docs_file
            if not writer:
                path = self._dirout + "//other//encoder_docs_statistics.txt"
                utils.makedirs(os.path.dirname(path))
                writer = open(path, "w")
                self._multiencode_stats_docs_file = writer
        else:
            writer = self._multiencode_stats_freqs_file
            if not writer:
                path = self._dirout + "//other//encoder_freqs_statistics.txt"
                utils.makedirs(os.path.dirname(path))
                writer = open(path, "w")
                self._multiencode_stats_freqs_file = writer

        data = "Term: " + term + "; "
        data += "EncodeType: " + str(etype.name) + "; "
        data += "Numbers: " + str(numbers) + "\n"
        writer.write(data)
示例#2
0
def main(args):
    '''Punto de entrada.'''
    utils.makedirs(OUTPUT)

    for fid in sorted(FILES_TO_ANALYZE):
        print("Analizando {0}...".format(fid))
        analyze(fid, FILES_TO_ANALYZE[fid])
示例#3
0
    def __merge_child_indexes(self):
        '''Mergea los índices creados por los indexadores hijos.'''
        utils.makedirs(self._dirout)

        # Cálculo de cantidad de índices de los que se cargarán la información
        # de chunks a RAM.
        child_count = len(self.__child_indexes)
        cdata_indexes_to_load = int(round(child_count*RESOURCES_FACTOR, 0))

        print("\nMergeando...")
        info = "Total de subíndices: {0} ({1}/{0} con chunks info en RAM)."
        print(info.format(child_count, cdata_indexes_to_load))
        print("Cargando subíndices...")

        # Load de indexadores hijos.
        for i in range(0, len(self.__child_indexes)):
            index = self.__child_indexes[i]

            if not index.is_loaded():
                index.load(chunks_info_in_memory=cdata_indexes_to_load > 0)
                cdata_indexes_to_load -= 1
                info = "Subíndice {0}/{1} cargado."
                print(info.format(i+1, child_count))

        self.__merge_child_collections()
        self.__merge_child_postings()
示例#4
0
    def __write_indexation_info(self, dirout):
        '''Almacena información de subindexación en el dir de salida dado.

        Args:
            dirout (string): directorio de salida.
        '''
        utils.makedirs(dirout + "/other")
        fstatus = open("{0}/status.txt".format(dirout + "/other"), "w")

        info = "Creación de subíndice finalizada correctamente."
        fstatus.write(info)
        fstatus.close()
示例#5
0
    def test_indexes(self, chunks_info_in_memory=False):
        '''Testea los índices especificados.

        Args:
            chunks_info_in_memory (bool): indica si la información de chunks se
                debe cargar en RAM.
        '''
        self.__check_queries_load()

        # Creación de directorio de out.
        dirout = self.__base_dirout + "/indisk/"
        if chunks_info_in_memory:
            dirout = self.__base_dirout + "/inmemory/"

        utils.makedirs(dirout)

        for dirindex in self.__dirindexes:
            self.test_index(dirindex, chunks_info_in_memory)
示例#6
0
    def _save(self, docs, terms, dirout):
        '''Genera índice en base a dicts de docs y terms pasados por parámetro.

        Args:
            docs (dict): hash de documentos.
            terms (dict): hash de términos.
            dirout (string): directorio de salida de índice.

        Returns:
            index (Index): término generado.
        '''
        utils.makedirs(dirout)

        index = Index(dirout)
        super()._dump_docs_dict(docs, index)
        self._dump_terms_dict(terms, index)

        return index
示例#7
0
    def create_index(self, dirout, overwrite=False, chunk_size=0):
        '''Realiza indexación en base a directorio de in.

        Args:
            dirout (string): directorio de salida.
            overwrite (bool): indica si se debe sobrescribir el índice en caso
                              de que ya exista.
            chunk_size (int): tamaño máximo de chunks de postings. Si es 1, la
                posting se almacenará se almacenará 'contigua'.

        Returns:
            index (Index): índice generado.
            status (IndexStatusTypes): cód. de estado respecto a la generación
                del índice (ya indexado, directorio de in no existente, ok).
        '''
        print("Indexación en progreso...")

        # Info de multicompresión.
        doc_multiencode = isinstance(self.doc_encode, list)
        freq_multiencode = isinstance(self.freq_encode, list)
        self._multiencode = doc_multiencode or freq_multiencode

        # Selección de caller de writer de encoded.
        if doc_multiencode:
            self._write_docs_caller = self._write_multiencode_block
        else:
            self._write_docs_caller = self._write_monoencode_block

        if freq_multiencode:
            self._write_freqs_caller = self._write_multiencode_block
        else:
            self._write_freqs_caller = self._write_monoencode_block

        # Escritura de stats en caso de multiencode en docs y freqs.
        if doc_multiencode and freq_multiencode:
            self._has_to_write_multiencode_stats = True

        # Directorio de salida de índice.
        self._dirout = dirout

        # Tamaño de chunk.
        self._chunk_size = chunk_size

        # Índice.
        self.index = Index(self._dirout)

        # Si ya existe el índice y no se permite sobre-escritura...
        if self.index.exists() and not overwrite:
            print("Ya indexado...\n")
            # Retorno de índice + error de ya indexado.
            return self.index, IndexerStatusTypes.Already_Indexed

        # Si no existe dirin...
        if not os.path.exists(self.__dirin):
            print("Directorio de colección inexistente...\n")
            # Retorna de null + error de colección no existente.
            return self.index, IndexerStatusTypes.Collection_Non_Existent

        # Si se deben reusar archivos temporales anteriores...
        if self.__reuse_tmp:
            self.__try_load_child_indexes()

        if not self.__child_indexes:
            print("Creando subíndices temporales...")
            start = time.time()
            self.__create_child_indexes()
            end = time.time()
            print("Tiempo de creación de subíndices temporales:", round(end-start, 2))
        else:
            print("Archivos de subíndices temporales existentes.")

        start = time.time()
        if self.__child_indexes:
            self.__merge_child_indexes()
            end = time.time()
        else:
            ex = "Imposible realizar merge de índice (not exists childs)"
            raise Exception(ex)

        info = ">> Tiempo de merge de índice: " + str(round(end-start, 2))
        info += "\n\n>> Tamaño de archivos: "
        info += "\nCollection: {0} MiB"
        info += "\nChunks info: {1} MiB"
        info += "\nVocabulary: {2} MiB"
        info += "\nPostings: {3} MiB"

        coll_size = ((os.path.getsize(self.index.collection_path))/1024)/1024
        chin_size = ((os.path.getsize(self.index.chunksinfo_path))/1024)/1024
        voca_size = ((os.path.getsize(self.index.vocabulary_path))/1024)/1024
        post_size = ((os.path.getsize(self.index.postings_path))/1024)/1024
        info = info.format(round(coll_size, 1), round(chin_size, 1),
                           round(voca_size, 1), round(post_size, 1))

        print("\n" + info + "\n")
        utils.makedirs(self._dirout + "//other/")
        fstatus = open(self._dirout + "//other/status.txt", "w")
        fstatus.write(info)
        fstatus.close()

        # Retorno de index y status = ok.
        return self.index, IndexerStatusTypes.Ok
def main(args):
    '''Punto de entrada.'''
    utils.makedirs(OUTPUT_DIR)
    analyze()