Почему добавление дампа 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");

person matentzn    schedule 13.12.2017    source источник
comment
из Интернета в качестве входного потока: не могли бы вы попытаться загрузить все из Интернета во временный файл, а затем добавить этот временный файл в свой репозиторий? возможно, rdf4j делает соединение для каждой тройки, и поэтому это занимает так много времени   -  person ChristophE    schedule 13.12.2017


Ответы (1)


Вы можете попробовать следующее:

  1. Проверьте Интернет в нисходящем направлении, например. протестируйте тот же код с локальным файлом.
  2. Проверьте восходящий интернет, например. использовать репозиторий в памяти Repository repo = new SailRepository(new MemoryStore());
  3. Дайте вашему Java-приложению достаточно памяти, используя -Xmx в JAVA_OPTS.
  4. Не знаю, для чего предназначено conn.clear(context);. Насколько я понимаю, удалит все триплеты в контексте?

С моего места загрузка 10 000 000 троек дампа rdf 2,7G из викиданных в репозиторий в памяти занимает около 5 минут (я запускаю тесты 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);
    }
}
person jschnasse    schedule 13.12.2017
comment
В конце концов, это была часть ответа. Другая часть заключалась в том, что я каким-то образом включил прямой вывод типов, который становится все медленнее и медленнее по мере роста КБ. - person matentzn; 20.12.2017