2013-10-10 4 views
0

J'utilise Sésame pour interroger RDF via SPARQL. Je travaille avec de gros fichiers (2 Go, 10 Go) et je fais plusieurs requêtes par la suite. Pendant le travail avec ces gros fichiers, j'obtiens une erreur java.lang.OutOfMemoryError: Java heap space. Je cours mon application avec le param -Xmx3g mais il semble que ce n'est pas assez pour ces fichiers. Peut-être que je devrais fermer un référentiel après chaque requête que je fais?Java OutOfMemoryError avec Sésame

Il est mon code:

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(); 
} 

Aussi, est-il possible d'utiliser MemoryStore au lieu de nativestore pour ces gros fichiers?

Exemple d'une requête qui émet une erreur:

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) 
} 
+0

Obtenez-vous cette OutOfMemoryError lors de l'exécution des requêtes? C'est très inhabituel. À quoi ressemblent vos requêtes? En ce qui concerne l'utilisation d'un magasin de mémoire: Je doute que vous puissiez insérer un fichier de données 10G dans un magasin de mémoire si vous n'avez que 3 G d'espace mémoire. –

+0

@JeenBroekstra une requête a été ajoutée – YAPPO

Répondre

1

Donc c'est SP2b la requête 4 (information qui aurait été utile de fournir dans votre message original, s'il vous plaît être grâce à vos questions si vous attendez les gens à soyez minutieux avec leurs réponses).

SP2B La requête 4 à l'échelle 5M renvoie des résultats ~ 18,4M. Le jeu de données 5M (en tortue) est ~ 500M, donc étant donné vos tailles indiquées, je suppose que vous essayez ceci avec les jeux de données 25M et 100M?

Les original authors n'étaient même pas capables de publier la taille de l'ensemble de résultats pour Q4 car rien ne pouvait le calculer (au moins avec les limites de l'étude). Compte tenu du facteur d'échelle apparent dans l'ensemble de données pour les résultats de cette requête, j'imagine que nous prenons environ 100m + résultats à l'échelle de 25M, et peut-être autant que les résultats 1B à l'échelle de 100M.

La taille des jointures intermédiaires nécessaires pour calculer un ensemble de résultats de cette taille est énorme et il n'est pas étonnant que 3G de RAM ne soit pas suffisant. Le sésame est un bon système, mais je n'ai aucune idée de la quantité de mémoire nécessaire pour répondre à cette requête à cette échelle, ou même si elle pourrait y répondre. À ma connaissance, un seul système a signalé l'exécution de cette requête à 25 Mo et personne ne l'a exécuté à 100 Mo. À ma connaissance, un seul système a signalé l'exécution de cette requête à 25 M et pas à 100 M. C'est pourquoi SP2B est un excellent benchmark, mais pervers. Vous pourriez lire un peu plus de documentation sur le sujet, et aussi regarder dans BSBM, si vous essayez de faire une analyse comparative des performances de triple magasin.