2017-12-08 7 views
3

Ich versuche, Daten in einer Datenbanktabelle in einer Reihe von Tripel zu konvertieren, also schreibe ich eine Eulen-Datei mit Jena Java-Bibliothek. Ich habe es mit einer kleinen Anzahl von Tabellensätzen (100) erfolgreich gemacht, was fast 20.000 Zeilen in der .owl-Datei entspricht, und ich bin damit zufrieden.Kann keine große Eulen-Datei mit Jena schreiben

die Eule-Datei zu schreiben, ich den folgenden Code verwendet haben (m ist ein OntModel Objekt):

BufferedWriter out = null; 
try { 
    out = new BufferedWriter (new FileWriter(FILENAME));   
    m.write(out); 
    out.close(); 
}catch(IOException e) {}; 

Leider wenn ich versuche, das gleiche mit dem gesamten Ergebnismenge der Tabelle (800,000 Datensätze) zu tun eclipse-Konsole zeigt mir die Ausnahme:

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded 

die Ausnahme von

m.write(out); 
0 angehoben

Ich bin absolut sicher, dass das Modell korrekt ausgefüllt ist, weil ich versucht habe, das Programm auszuführen, ohne die Eulen-Datei zu erstellen, und alles hat gut funktioniert. Um es zu beheben, habe ich versucht, Heap-Speichereinstellung -Xmx4096M in run->configuration->vm arguments erhöhen, aber der Fehler weiterhin auftritt.

Ich führe die Anwendung auf einem Macbook, so dass ich keinen unbegrenzten Speicher habe. Gibt es Chancen, die Aufgabe zu erfüllen? Vielleicht gibt es eine effizientere Möglichkeit, das Modell zu speichern?

+1

Schreiben Sie es als N-Triples funktioniert nicht? Wie groß ist das Modell, d. H. Was ist die Ausgabe von 'm.size()'? – AKSW

+0

die Modellgröße ist 4827075. Jeder Ihrer Vorschlag über N-Triples funktioniert! –

+1

Wenn es in Ordnung ist, sollten Sie 'N-Triples' als Serialisierungsformat bevorzugen. Ohne die Sprache anzugeben, wird die Ausgabe das 'RDF/XML'-Format haben, und XML benötigt tatsächlich viel mehr Speicher, um den XML-Baum aufzubauen. – AKSW

Antwort

5

Das Standardformat ist RDF/XML ist eine hübsche Form, aber um das "hübsche" zu berechnen, muss eine Menge Arbeit geleistet werden, bevor das Schreiben beginnt. Dies beinhaltet den Aufbau interner Datenstrukturen. Einige Datenformen verursachen recht umfangreiche Arbeiten, die auf der Suche nach der "hübschesten" Variante durchgeführt werden müssen.

RDF/XML in hübscher Form ist das teuerste Format. Selbst die hübsche Turtle-Form ist billiger, obwohl es noch einige Vorbereitungsberechnungen beinhaltet.

Um in RDF/XML in einem einfacheren Format, ohne komplexe ziemlich Funktionen zu schreiben:

RDFDataMgr.write(System.out, m, RDFFormat.RDFXML_PLAIN);

Ausgangsströme bevorzugt werden, und der Ausgang wird UTF-8 sein - "new BufferedWriter (new FileWriter(FILENAME));" verwenden die Plattform-Standardzeichensatz.

finden Sie in der Dokumentation für andere Formate und Variationen:

https://jena.apache.org/documentation/io/rdf-output.html

wie RDFFormat.TURTLE_BLOCKS.

Verwandte Themen