我正在尝试为我使用eclipse / jena创建的语义Web项目分析大型数据转储。
我正在使用tdb数据库,该数据库对于2gb正常工作,但是文件6gb以上时遇到内存问题。
我的目标是从数据源中提取所有谓词对象和主题(并将它们写入json文件)。有没有一种方法可以直接查询tdb数据而无需全部加载到模型中?
另外:以下代码中的model.read是否还将全部数据存储在内存中?
HttpSession session = request.getSession();
session.setAttribute("dataSource", data);
ServletContext servletContext = request.getServletContext();
String tdbPath = servletContext.getRealPath("/tdb");
File dir = new File(contextPath);
Dataset dataset = TDBFactory.createDataset(tdbPath);
Model model = dataset.getDefaultModel();
InputStream str = FileManager.get().open(data);
model.read(str,null);
最佳答案
您的示例中的model.read不会将所有内容读取到内存中,因为它由TDB支持。
在servlet中加载大型文件并不是很好的用户体验。
您可以使用批量加载器提前加载文件吗?
您需要确保TDB的缓存具有1G(64位)或2G(32位Java)的堆。 TDB使用64位以及堆上的内存映射文件。
您可以使用RDFDataMgr.parse以流方式处理RDF。