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()