You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@jena.apache.org by David Jordan <Da...@sas.com> on 2013/04/24 19:06:07 UTC
TDB exception
I got this while running code with an ontology that has worked many times before, on both SDB and TDB.
Any guess as to why? Now any calls to get a named model are dying.
Have I corrupted my TDB database? Is there something wrong in my class Database provided below?
I see that I had not done a TDB.sync(dataset), could that be the problem?
[java] Exception in thread "main" com.hp.hpl.jena.tdb.base.file.FileException: ObjectFileStorage.read[prefixes.dat](659)[filesize=713][file.size()=713]: Impossibly large object : 1914830848 bytes > filesize-(loc+SizeOfInt)=50
[java] at com.hp.hpl.jena.tdb.base.objectfile.ObjectFileStorage.read(ObjectFileStorage.java:346)
[java] at com.hp.hpl.jena.tdb.lib.NodeLib.fetchDecode(NodeLib.java:78)
[java] at com.hp.hpl.jena.tdb.nodetable.NodeTableNative.readNodeFromTable(NodeTableNative.java:178)
[java] at com.hp.hpl.jena.tdb.nodetable.NodeTableNative._retrieveNodeByNodeId(NodeTableNative.java:103)
[java] at com.hp.hpl.jena.tdb.nodetable.NodeTableNative.getNodeForNodeId(NodeTableNative.java:74)
[java] at com.hp.hpl.jena.tdb.nodetable.NodeTableWrapper.getNodeForNodeId(NodeTableWrapper.java:55)
[java] at com.hp.hpl.jena.tdb.nodetable.NodeTableInline.getNodeForNodeId(NodeTableInline.java:67)
[java] at com.hp.hpl.jena.tdb.lib.TupleLib.tupleNodes(TupleLib.java:97)
[java] at com.hp.hpl.jena.tdb.lib.TupleLib$1.convert(TupleLib.java:53)
[java] at com.hp.hpl.jena.tdb.lib.TupleLib$1.convert(TupleLib.java:49)
[java] at org.apache.jena.atlas.iterator.Iter$4.next(Iter.java:301)
[java] at com.hp.hpl.jena.tdb.sys.DatasetControlMRSW$IteratorCheckNotConcurrent.next(DatasetControlMRSW.java:130)
[java] at com.hp.hpl.jena.tdb.store.DatasetPrefixesTDB.readPrefixMap(DatasetPrefixesTDB.java:173)
[java] at com.hp.hpl.jena.sparql.graph.GraphPrefixesProjection.getNsPrefixMap(GraphPrefixesProjection.java:62)
[java] at com.hp.hpl.jena.tdb.store.DatasetPrefixesTDB.getPrefixMapping(DatasetPrefixesTDB.java:223)
[java] at com.hp.hpl.jena.tdb.store.GraphNamedTDB.createPrefixMapping(GraphNamedTDB.java:66)
[java] at com.hp.hpl.jena.graph.impl.GraphBase.getPrefixMapping(GraphBase.java:186)
[java] at com.hp.hpl.jena.rdf.model.impl.ModelCom.getPrefixMapping(ModelCom.java:959)
[java] at com.hp.hpl.jena.rdf.model.impl.ModelCom.withDefaultMappings(ModelCom.java:1003)
[java] at com.hp.hpl.jena.rdf.model.impl.ModelCom.<init>(ModelCom.java:74)
[java] at com.hp.hpl.jena.rdf.model.impl.ModelCom.<init>(ModelCom.java:70)
[java] at com.hp.hpl.jena.rdf.model.ModelFactory.createModelForGraph(ModelFactory.java:176)
[java] at com.hp.hpl.jena.sparql.core.DatasetImpl.graph2model(DatasetImpl.java:269)
[java] at com.hp.hpl.jena.sparql.core.DatasetImpl.getNamedModel(DatasetImpl.java:174)
[java] at com.sas.ta.om.Database.getModel(Database.java:60)
[java] at com.sas.ta.om.CreateInferredModel.create(CreateInferredModel.java:29)
[java] at com.sas.ta.om.CreateInferredModel.main(CreateInferredModel.java:18)
Right before I ran this, I had deleted all the data for a model with the following:
Model model = Database.getModel(modelName);
model.begin();
model.removeAll();
model.commit();
model.close();
Database.close();
Here is my Database class:
public class Database {
private static final String TDB_TYPE = "TDB";
private static final String SDB_TYPE = "SDB";
private static final String SDB_ASSEMBLER_FILE = "sdb.ttl";
private static final String TDB_ASSEMBLER_FILE = "tdb.ttl";
private static final String JENA_DBTYPE = System.getProperty("JENA_DBTYPE");
private static final boolean isTDB = TDB_TYPE.equals(JENA_DBTYPE);
static {
if( isTDB ) TDB.setOptimizerWarningFlag(false);
}
private static Store store = null;
private static Dataset dataset = null;
public static final String getDBType(){
return JENA_DBTYPE;
}
public static void close(){
if( isTDB && dataset != null ){
dataset.close();
} else {
if( store != null ) store.close();
}
}
public static void begin(Model model, ReadWrite mode){
if( isTDB ){
if( dataset == null )
dataset = TDBFactory.assembleDataset(TDB_ASSEMBLER_FILE);
dataset.begin(mode);
} else {
model.begin();
}
}
public static void commit(Model model){
model.commit();
}
public static void sync(){
if( dataset != null ) TDB.sync(dataset);
}
public static Model getModel(String name){
if( TDB_TYPE.equals(JENA_DBTYPE) ){
if( dataset == null )
dataset = TDBFactory.assembleDataset(TDB_ASSEMBLER_FILE);
return dataset.getNamedModel(name);
} else {
if( store == null )
store = StoreFactory.create(SDB_ASSEMBLER_FILE);
return SDBFactory.connectNamedModel(store, name);
}
}
}
David Jordan
Senior Software Developer
SAS Institute Inc.
Health & Life Sciences, Research & Development
Bldg R ▪ Office 4467
600 Research Drive ▪ Cary, NC 27513
Tel: 919 531 1233 ▪ david.jordan@sas.com<ma...@sas.com>
www.sas.com<http://www.sas.com/>
SAS® … THE POWER TO KNOW®
Re: TDB exception
Posted by Andy Seaborne <an...@apache.org>.
> Model model = Database.getModel(modelName);
> model.begin();
> model.removeAll();
> model.commit();
> model.close();
> Database.close();
The dataset transaction mechanism for TB is separate from the Model one.
While it tries to do it's best, it isn't perfect (and can't be - the
old style begin() means you don't know if it's a read or write
transaction which is a big efficiency issue).
http://jena.apache.org/documentation/tdb/tdb_transactions.html
> Have I corrupted my TDB database?
Yes - sorry. Looks like in the past, TDB.sync was called before shutdown.
Andy
On 24/04/13 18:06, David Jordan wrote:
>
> I got this while running code with an ontology that has worked many times before, on both SDB and TDB.
> Any guess as to why? Now any calls to get a named model are dying.
> Have I corrupted my TDB database? Is there something wrong in my class Database provided below?
> I see that I had not done a TDB.sync(dataset), could that be the problem?
>
>
> [java] Exception in thread "main" com.hp.hpl.jena.tdb.base.file.FileException: ObjectFileStorage.read[prefixes.dat](659)[filesize=713][file.size()=713]: Impossibly large object : 1914830848 bytes > filesize-(loc+SizeOfInt)=50
> [java] at com.hp.hpl.jena.tdb.base.objectfile.ObjectFileStorage.read(ObjectFileStorage.java:346)
> [java] at com.hp.hpl.jena.tdb.lib.NodeLib.fetchDecode(NodeLib.java:78)
> [java] at com.hp.hpl.jena.tdb.nodetable.NodeTableNative.readNodeFromTable(NodeTableNative.java:178)
> [java] at com.hp.hpl.jena.tdb.nodetable.NodeTableNative._retrieveNodeByNodeId(NodeTableNative.java:103)
> [java] at com.hp.hpl.jena.tdb.nodetable.NodeTableNative.getNodeForNodeId(NodeTableNative.java:74)
> [java] at com.hp.hpl.jena.tdb.nodetable.NodeTableWrapper.getNodeForNodeId(NodeTableWrapper.java:55)
> [java] at com.hp.hpl.jena.tdb.nodetable.NodeTableInline.getNodeForNodeId(NodeTableInline.java:67)
> [java] at com.hp.hpl.jena.tdb.lib.TupleLib.tupleNodes(TupleLib.java:97)
> [java] at com.hp.hpl.jena.tdb.lib.TupleLib$1.convert(TupleLib.java:53)
> [java] at com.hp.hpl.jena.tdb.lib.TupleLib$1.convert(TupleLib.java:49)
> [java] at org.apache.jena.atlas.iterator.Iter$4.next(Iter.java:301)
> [java] at com.hp.hpl.jena.tdb.sys.DatasetControlMRSW$IteratorCheckNotConcurrent.next(DatasetControlMRSW.java:130)
> [java] at com.hp.hpl.jena.tdb.store.DatasetPrefixesTDB.readPrefixMap(DatasetPrefixesTDB.java:173)
> [java] at com.hp.hpl.jena.sparql.graph.GraphPrefixesProjection.getNsPrefixMap(GraphPrefixesProjection.java:62)
> [java] at com.hp.hpl.jena.tdb.store.DatasetPrefixesTDB.getPrefixMapping(DatasetPrefixesTDB.java:223)
> [java] at com.hp.hpl.jena.tdb.store.GraphNamedTDB.createPrefixMapping(GraphNamedTDB.java:66)
> [java] at com.hp.hpl.jena.graph.impl.GraphBase.getPrefixMapping(GraphBase.java:186)
> [java] at com.hp.hpl.jena.rdf.model.impl.ModelCom.getPrefixMapping(ModelCom.java:959)
> [java] at com.hp.hpl.jena.rdf.model.impl.ModelCom.withDefaultMappings(ModelCom.java:1003)
> [java] at com.hp.hpl.jena.rdf.model.impl.ModelCom.<init>(ModelCom.java:74)
> [java] at com.hp.hpl.jena.rdf.model.impl.ModelCom.<init>(ModelCom.java:70)
> [java] at com.hp.hpl.jena.rdf.model.ModelFactory.createModelForGraph(ModelFactory.java:176)
> [java] at com.hp.hpl.jena.sparql.core.DatasetImpl.graph2model(DatasetImpl.java:269)
> [java] at com.hp.hpl.jena.sparql.core.DatasetImpl.getNamedModel(DatasetImpl.java:174)
> [java] at com.sas.ta.om.Database.getModel(Database.java:60)
> [java] at com.sas.ta.om.CreateInferredModel.create(CreateInferredModel.java:29)
> [java] at com.sas.ta.om.CreateInferredModel.main(CreateInferredModel.java:18)
>
> Right before I ran this, I had deleted all the data for a model with the following:
>
> Model model = Database.getModel(modelName);
> model.begin();
> model.removeAll();
> model.commit();
> model.close();
> Database.close();
>
> Here is my Database class:
>
> public class Database {
> private static final String TDB_TYPE = "TDB";
> private static final String SDB_TYPE = "SDB";
> private static final String SDB_ASSEMBLER_FILE = "sdb.ttl";
> private static final String TDB_ASSEMBLER_FILE = "tdb.ttl";
> private static final String JENA_DBTYPE = System.getProperty("JENA_DBTYPE");
> private static final boolean isTDB = TDB_TYPE.equals(JENA_DBTYPE);
> static {
> if( isTDB ) TDB.setOptimizerWarningFlag(false);
> }
>
> private static Store store = null;
> private static Dataset dataset = null;
>
> public static final String getDBType(){
> return JENA_DBTYPE;
> }
>
> public static void close(){
> if( isTDB && dataset != null ){
> dataset.close();
> } else {
> if( store != null ) store.close();
> }
> }
>
> public static void begin(Model model, ReadWrite mode){
> if( isTDB ){
> if( dataset == null )
> dataset = TDBFactory.assembleDataset(TDB_ASSEMBLER_FILE);
> dataset.begin(mode);
> } else {
> model.begin();
> }
> }
>
> public static void commit(Model model){
> model.commit();
> }
>
> public static void sync(){
> if( dataset != null ) TDB.sync(dataset);
> }
>
> public static Model getModel(String name){
> if( TDB_TYPE.equals(JENA_DBTYPE) ){
> if( dataset == null )
> dataset = TDBFactory.assembleDataset(TDB_ASSEMBLER_FILE);
> return dataset.getNamedModel(name);
> } else {
> if( store == null )
> store = StoreFactory.create(SDB_ASSEMBLER_FILE);
> return SDBFactory.connectNamedModel(store, name);
> }
> }
> }
>
>
> David Jordan
> Senior Software Developer
> SAS Institute Inc.
> Health & Life Sciences, Research & Development
> Bldg R ▪ Office 4467
> 600 Research Drive ▪ Cary, NC 27513
> Tel: 919 531 1233 ▪ david.jordan@sas.com<ma...@sas.com>
> www.sas.com<http://www.sas.com/>
> SAS® … THE POWER TO KNOW®
>