2017-09-11 31 views
1

我每次试图加载和处理一堆.owl文件的时间面临的问题java.lang.OutOfMemoryError在我的应用程序。我在一个目录中有500个奇怪的.owl文件,我在for循环中使用OWL API的loadOntologyFromOntologyDocument()方法将它们逐个加载到内存中。但是,在方法加载一些本体之后,内存开始耗尽。未使用的对象引用没有被垃圾收集器清理。我搜索了这个问题,并且使用了-Xmx来增加许多人建议的堆大小到5GB。但问题仍然存在。我感谢在这方面的任何帮助。Java垃圾收集未清理内存在加载本体文件

OWLOntologyManager owlManager = OWLManager.createOWLOntologyManager(); 
File folder = new File("G:\\OWL and OBO"); 
File[] listOfFiles = folder.listFiles(); 
for (int i = 0; i < listOfFiles.length; i++) { 
    if (listOfFiles[i].isFile()) { 
     System.out.println("File " + listOfFiles[i].getName()); 
     try{ 
      File sourceFile = new File("G:\\OWL and OBO\\" + listOfFiles[i].getName()); 
      OWLOntology ontology = owlManager.loadOntologyFromOntologyDocument(sourceFile); 
     } catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 
+0

5gb不是jvm真的会接受的。尝试使用1024,2048和更多。我的经验是,4k不应该克服工作 –

+0

5GB或任何其他号码将工作,它不一定是一个标准的2^n号码。但是,您的代码(或“OWLOntologyManager”)实际上可能正在使用该内存。什么是文件的大小和你有多少文件? – Zilvinas

回答

0

OWLOntologyManager似乎可能挂在文件之间的某些内存上。你有没有尝试在listOfFiles循环内移动第一行?为每个文件创建一个新实例将会“更加昂贵”,但这比'破坏'要好。

File folder = new File("G:\\OWL and OBO"); 
File[] listOfFiles = folder.listFiles(); 
for (int i = 0; i < listOfFiles.length; i++) { 
    if (listOfFiles[i].isFile()) { 
     OWLOntologyManager owlManager = OWLManager.createOWLOntologyManager(); 
     System.out.println("File " + listOfFiles[i].getName()); 
     try{ 
      File sourceFile = new File("G:\\OWL and OBO\\" + listOfFiles[i].getName()); 
      OWLOntology ontology = owlManager.loadOntologyFromOntologyDocument(sourceFile); 
     } catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 
+0

它没有中断地工作。非常感谢。 – user8594397

+0

@ user8594397 Javadoc说:“OWLOntologyManager还管理本体和本体文档之间的映射。为了管理这样的映射,它必须保存所有加载的数据。 – maaartinus