[Pellet-users] Pellet-backed models not being garbage collected

Todor Dimitrov todor.dimitrov at stud.uni-due.de
Mon Jun 23 17:16:47 UTC 2008


Hi everyone,

I'm trying to use pellet in a "production" system where different  
ontologies have to be loaded upon request. The system is comprised of  
a knowledge base with only ONE loaded pellet-backed model at a time.  
I've assumed that whenever I create a new model the old one should be  
garbage collected. This is obviously not the case as I keep getting  
"OutOfMemory" errors. Here is a sample piece of code to test the  
behavior:

/**
  * @author Todor Dimitrov (todor.dimitrov at stud.uni-due.de)
  * @version Jun 23, 2008 3:26:02 PM
  */
public class TestJenaPellet {

	/** The base URI for the domain model */
	public static final String MODEL_URI = "http://www.owl-ontologies.com/domain-ontology.owl# 
";

	/** The base URI for the instances model */
	public static final String INSTANCES_URI = "http://www.owl-ontologies.com/test-ontology.owl# 
";

	/** Prefix for all SPAQL queries */
	public static final String SPARQL_PREFIX = "PREFIX domain:   <" +  
MODEL_URI
			+ ">\n"
			+ "PREFIX rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
			+ "PREFIX rdfs:  <http://www.w3.org/2000/01/rdf-schema#>\n"
			+ "PREFIX owl:	 <http://www.w3.org/2002/07/owl#>\n"
			+ "PREFIX xsd:	 <http://www.w3.org/2001/XMLSchema#>\n";

	static {
		final OntDocumentManager manager = OntDocumentManager.getInstance();
		final String modelUri = MODEL_URI.substring(0, MODEL_URI
				.lastIndexOf("#"));
		try {
			manager.addAltEntry(modelUri, TestJenaPellet.class.getResource(
					"domain-ontology.owl").toString());
		} catch (Exception ex) {
			throw new RuntimeException(ex);
		}
	}

	/**
	 * Retrieves the pellet model
	 *
	 * @return the non-null model
	 */
	private static OntModel getPelletModel() {
		final OntModel baseModel = getBaseModel();
		return  
ModelFactory.createOntologyModel(PelletReasonerFactory.THE_SPEC,
				baseModel);
	}

	/**
	 * Retrieves the base model
	 *
	 * @return the non-null base model
	 */
	private static OntModel getBaseModel() {
		final OntModel ontModel = ModelFactory
				.createOntologyModel(OntModelSpec.OWL_DL_MEM);
		final String modelUri = MODEL_URI.substring(0, MODEL_URI
				.lastIndexOf("#"));
		final String instanceUri = INSTANCES_URI.substring(0, INSTANCES_URI
				.lastIndexOf("#"));
		final Ontology ontology = ontModel.createOntology(instanceUri);
		ontology.addImport(ontModel.createResource(modelUri));
		ontModel.loadImports();
		return ontModel;
	}

	/**
	 * Executes SPARQL queries
	 */
	@Test
	public void testQueries() throws Exception {
		final String queryString = "select ?room where {?room rdf:type  
domain:Room.}";
		final Set<Individual> rooms = new HashSet<Individual>();
		for (int i = 0; i < 10000; i++) {
			rooms.clear();
			final OntModel model = getPelletModel();
			// final OntModel model = getBaseModel();
			final QueryExecution qe = QueryExecutionFactory.create(
					SPARQL_PREFIX + queryString, model);
			try {
				// Execute the query and obtain results
				final ResultSet result = qe.execSelect();
				while (result.hasNext()) {
					final QuerySolution solution = result.nextSolution();
					final RDFNode node = solution.get("room");
					final Individual room = model.getIndividual(node.asNode()
							.getURI());
					rooms.add(room);
				}
			} finally {
				// Important - free up resources used running the query
				qe.close();
			}
			System.out.println("Iteration " + (i + 1) + " :: number of rooms: "
					+ rooms.size());
		}
	}
}

and the very simple ontology:

<?xml version="1.0"?>
<rdf:RDF
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
     xmlns:protege="http://protege.stanford.edu/plugins/owl/protege#"
     xmlns:xsp="http://www.owl-ontologies.com/2005/08/07/xsp.owl#"
     xmlns:owl="http://www.w3.org/2002/07/owl#"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
     xmlns:swrl="http://www.w3.org/2003/11/swrl#"
     xmlns:swrlb="http://www.w3.org/2003/11/swrlb#"
     xmlns="http://www.owl-ontologies.com/domain-ontology.owl#"
     xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
   xml:base="http://www.owl-ontologies.com/domain-ontology.owl">
   <owl:Ontology rdf:about=""/>
   <owl:Class rdf:ID="Room"/>
   <Room rdf:ID="Room_4"/>
   <Room rdf:ID="Room_3"/>
   <Room rdf:ID="Room_5"/>
   <Room rdf:ID="Room_6"/>
   <Room rdf:ID="Room_1"/>
   <Room rdf:ID="Room_10"/>
   <Room rdf:ID="Room_9"/>
   <Room rdf:ID="Room_11"/>
   <Room rdf:ID="Room_7"/>
   <Room rdf:ID="Room_2"/>
   <Room rdf:ID="Room_12"/>
   <Room rdf:ID="Room_8"/>
</rdf:RDF>

In the "testQueries()" method approximately 700-800 iterations are  
possible (with the default heap size!). If I only use the base model,  
the program terminates normally. Does pellet cache any of the models  
and is there a way to clear the cache?


Thanks in advance,

Todor
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.owldl.com/pipermail/pellet-users/attachments/20080623/9c50fe6c/attachment-0001.htm 


More information about the Pellet-users mailing list