Почему добавление дампа RDF (InputStream) в репозиторий RDF4J происходит так медленно (на Java)?
Я загружаю осколки RDF из Интернета как InputStream, который содержит от 120 до 1500 троек. В среднем очистка контекста занимает около полсекунды, в то время как добавление троек занимает около 74 секунд для 120 троек. Физический размер файла сериализации RDFXML составляет от 6 КБ до 195 КБ.
InputStream input = ...
try (RepositoryConnection conn = db.getConnection()) {
try {
conn.clear(context);
conn.add(input, "", RDFFormat.RDFXML, context);
} catch (Exception e) {
e.printStackTrace();
}
}
Хранилище инициализируется следующим образом:
RemoteRepositoryManager manager = new RemoteRepositoryManager(serverUrl);
manager.initialize();
db = manager.getRepository("repo");
1 ответ
Вы можете попробовать следующее:
- Проверьте интернет ниже по течению, например, протестируйте тот же код с локальным файлом.
- Проверьте восходящий интернет, например, используйте репо в памяти
Repository repo = new SailRepository(new MemoryStore());
- Дайте вашему Java-приложению достаточно памяти, используя
-Xmx
в JAVA_OPTS - Не уверен что
conn.clear(context);
предназначен сделать. По моему пониманию это удалит все тройки в контексте?
От меня уходит около 5 минут, чтобы загрузить 10 000 000 троек дампов 2,7 г rdf из викиданных в репозиторий в памяти (я запускаю тесты maven с export MAVEN_OPTS=-Xmx7000m
). Это составляет ~33333 троек в секунду - если я рассчитал правильно;-).
@Test
public void variant3() throws MalformedURLException, IOException {
Repository repo = new SailRepository(new MemoryStore());
repo.initialize();
IRI context = repo.getValueFactory().createIRI("info/mycontext:context1");
RDFFormat format = RDFFormat.NTRIPLES;
System.out.println("Load zip file of format " + format);
try (InputStream in = new URL(
"https://tools.wmflabs.org/wikidata-exports/rdf/exports/20160801/wikidata-terms.nt.gz")
.openConnection().getInputStream();
NotifyingRepositoryConnectionWrapper con = new NotifyingRepositoryConnectionWrapper(repo,
repo.getConnection());) {
RepositoryConnectionListenerAdapter myListener = new RepositoryConnectionListenerAdapter() {
private long count = 0;
@Override
public void add(RepositoryConnection arg0, Resource arg1, IRI arg2, Value arg3, Resource... arg4) {
count++;
if (count % 100000 == 0)
System.out.println("Add statement number " + count + "\n" + arg1 + " " + arg2 + " " + arg3);
}
};
con.addRepositoryConnectionListener(myListener);
con.add(in, "", format,context);
} catch (Exception e) {
throw new RuntimeException(e);
}
}