Parsing e indicizzazione DBLP con Sax
« il: Marzo 18, 2019, 11:17 »
Ciao a tutti !
Dovrei fare il parsing e l'indicizzazione di DBLP tramite whoosh. Ho provato ad usare Sax testando il codice da me scritto su una versione ridotta del DBLP composta da circa 30.000 righe andando a creare circa un file xml da 30mb.
Inizialmente il tutto funzionava correttamente in quanto mi creava l'indice che io desideravo, però una volta che ho provato a dargli in pasto il dblp competo da 2,5 GB arrivo ad un punto dove whoosh mi crea circa 10,5 GB di file tmp e non va più avanti ! Come posso sistemare ? Grazie mille.



import xml.sax
from whoosh.index import create_in
from whoosh.fields import *
import sys
import os


types = ["article", "incollection", "inproceedings", "phdthesis", "mastersthesis"]




class DBLPHandler( xml.sax.ContentHandler ):
   def __init__(self):
      self.key = ""
      self.tag = ''
      self.author = ''
      self.title = ""
      self.year = ""
      #self.pages = ""
      #self.url = ''
      #self.ee = ''
      self.volume = ''
      self.journal = ''
      #self.number = ''
      self.crossref = ''
     
     
   def startDocument(self):
        print('Start Parsing......')

   def endDocument(self):
        print('Parse Successfully!')   

   
   # Call when an element starts
   def startElement(self, tag, attributes):
      self.CurrentData = tag
      if tag in types :
         key = attributes["key"]
         self.tag = tag
         self.key = key

         
   # Call when an elements ends
   def endElement(self, tag):
       if self.tag == tag :
           writer.add_document(pubtype = self.tag,
                                    key = self.key,                                   
                                    author = self.author,
                                    title = self.title,
                                    #pages = self.pages,
                                    year = self.year,
                                    volume = self.volume,
                                    journal = self.journal )
                                   # url = self.url,
                                    #ee = self.ee,
                                   # number = self.number,
                                    crossref = self.crossref
                                   
       
           self.author = ''
           self.title = ''
           self.year = ''
           #self.pages = ''
           #self.url = ''
           #self.ee = ''
           self.volume = ''
           self.journal = ''
           self.key = ''
           #self.mdate = ''
           self.crossref = ''
           self.tag = ''
           
           
# Call when a character is read
   def characters(self, content):

      if self.CurrentData == "author":
         self.author += content
      elif self.CurrentData == "title":
         self.title += content
      elif self.CurrentData == "year":
         self.year += content
     # elif self.CurrentData == "pages":
         #self.pages += content
      #elif self.CurrentData == "url":
         #self.url += content
      #elif self.CurrentData == "ee":
        # self.ee += content
      elif self.CurrentData == "volume":
         self.volume += content
      elif self.CurrentData == "journal":
         self.journal += content
      #elif self.CurrentData == "number":
         #self.number += content
      elif self.CurrentData == "crossref":
         self.crossref += content   
   
         
if ( __name__ == "__main__"):
   
    schema = Schema(#date=DATETIME(stored=True),
                                    pubtype=TEXT(stored=True),
                                    key=ID(stored=True),
                                    author=TEXT(stored=True),
                                    title=TEXT(stored=True),
                                    #pages=TEXT(stored=True),
                                    year=TEXT(stored=True),
                                    volume=TEXT(stored=True),
                                    journal=TEXT(stored=True),
                                    #number=TEXT(stored=True),
                                   # url=ID(stored=True),
                                    #ee=ID(stored=True),
                                    crossref=ID(stored=True)
                                    )
                                           
           
    if not os.path.exists("dblpindex"):
        os.mkdir("dblpindex")
    ix = create_in("dblpindex", schema)
    writer = ix.writer()
   
           # create an XMLReader
    parser = xml.sax.make_parser()
           # turn off namepsaces
    parser.setFeature(xml.sax.handler.feature_namespaces, 0)
       
    Handler = DBLPHandler()
    parser.setContentHandler( Handler )
   

    print('Inizio parsing e indicizzazione..')
   
    parser.parse('dblp.xml')
    print('inizio la commit...')
    writer.commit()