Java OutOfMemoryError с кунжутом

Я использую Sesame для запросов RDF через SPARQL. Я работаю с большими файлами (2 ГБ, 10 ГБ) и последовательно делаю несколько запросов. При работе с такими большими файлами получаю ошибку java.lang.OutOfMemoryError: Java heap space. Я запускаю свое приложение с параметром -Xmx3g, но мне кажется, что этого недостаточно для этих файлов. Может быть, мне следует закрывать репозиторий после каждого запроса, который я делаю?

Вот мой код:

void runQuery() {
   try {
       con = repo.getConnection();
       TupleQuery tupleQuery = con.prepareTupleQuery(QueryLanguage.SPARQL, queryString);
       TupleQueryResult result = tupleQuery.evaluate();
       while (result.hasNext()) {
           result.next();
       }
       result.close();
       con.close();
       } catch (Exception e) {
           ...
       }
   }
}

runTests() {
    File dataDir = new File("RepoDir/");
    repo = new SailRepository(new NativeStore(dataDir));
    repo.initialize();
    ...
    for (int j = 0; j < NUMBER_OF_QUERIES; ++j) {
        queryString  = queries.get(j);
        runQuery(); 
    }
    ...
    repo.shutDown();
}

Кроме того, можно ли использовать MemoryStore вместо NativeStore для таких больших файлов?

Пример запроса, выдающего ошибку:

SELECT DISTINCT ?name1 ?name2 
WHERE {
  ?article1 rdf:type bench:Article .
  ?article2 rdf:type bench:Article .
  ?article1 dc:creator ?author1 .
  ?author1 foaf:name ?name1 .
  ?article2 dc:creator ?author2 .
  ?author2 foaf:name ?name2 .
  ?article1 swrc:journal ?journal .
  ?article2 swrc:journal ?journal
  FILTER (?name1<?name2)
}

person YAPPO    schedule 10.10.2013    source источник
comment
Вы получаете эту ошибку OutOfMemoryError при выполнении запросов? Это очень необычно. Как выглядят ваши запросы? Что касается использования хранилища памяти: я сомневаюсь, что вы сможете поместить файл данных 10G в хранилище памяти, если у вас есть только 3G пространства кучи.   -  person Jeen Broekstra    schedule 20.10.2013
comment
@JeenBroekstra был добавлен запрос   -  person YAPPO    schedule 31.10.2013


Ответы (1)


Итак, это SP2B Query 4 (информацию, которую было бы полезно предоставить в исходном сообщении, пожалуйста, закончите свои вопросы, если вы ожидаете, что люди будут исчерпывающими в своих ответах).

SP2B Query 4 в масштабе 5 млн возвращает примерно 18,4 млн результатов. Набор данных 5M (в черепахе) составляет ~ 500M, поэтому, учитывая ваши заявленные размеры, я предполагаю, что вы пытаетесь сделать это с наборами данных 25M и 100M?

первоначальные авторы даже не смогли опубликовать размер результат установлен для Q4, так как ничто не могло его вычислить (по крайней мере, в рамках исследования). Учитывая коэффициент масштабирования, очевидный в наборе данных для результатов этого запроса, я полагаю, что мы получаем около 100 миллионов результатов в масштабе 25 миллионов и, возможно, до 1 миллиарда результатов в масштабе 100 миллионов.

Размер промежуточных соединений, необходимых для вычисления результирующего набора такого размера, огромен, и неудивительно, что 3G оперативной памяти недостаточно. Sesame — хорошая система, но я понятия не имею, сколько памяти потребуется, чтобы ответить на этот запрос в таком масштабе, и даже сможет ли она ответить на него вообще.

Насколько мне известно, только одна система сообщила о выполнении этого запроса на 25M, и никто не запускал его на 100M. Вот почему SP2B — отличный, но извращенный эталон. Вы можете прочитать немного больше справочного материала об этом, а также изучить BSBM, если вы пытаетесь провести бенчмаркинг производительности тройного хранилища.

person Michael    schedule 31.10.2013