2009-03-23 10 views
13

Quand dois-je utiliser RAMDirectory de Lucene? Quels sont ses avantages par rapport aux autres mécanismes de stockage? Enfin, où puis-je trouver un exemple de code simple?Utilisation de RAMDirectory

+0

En interne, il utilise une carte simultanée pour organiser les fichiers. – Njax3SmmM2x2a0Zf7Hpd

Répondre

16

Lorsque vous ne souhaitez pas stocker de manière permanente vos données d'index. Je l'utilise à des fins de test. Ajoutez des données à votre RAMDirectory, faites vos tests unitaires dans RAMDir.
par exemple.

public static void main(String[] args) { 
    try { 
     Directory directory = new RAMDirectory(); 
     Analyzer analyzer = new SimpleAnalyzer(); 
     IndexWriter writer = new IndexWriter(directory, analyzer, true); 

OU

public void testRAMDirectory() throws IOException { 

    Directory dir = FSDirectory.getDirectory(indexDir); 
    MockRAMDirectory ramDir = new MockRAMDirectory(dir); 

    // close the underlaying directory 
    dir.close(); 

    // Check size 
    assertEquals(ramDir.sizeInBytes(), ramDir.getRecomputedSizeInBytes()); 

    // open reader to test document count 
    IndexReader reader = IndexReader.open(ramDir); 
    assertEquals(docsToAdd, reader.numDocs()); 

    // open search zo check if all doc's are there 
    IndexSearcher searcher = new IndexSearcher(reader); 

    // search for all documents 
    for (int i = 0; i < docsToAdd; i++) { 
     Document doc = searcher.doc(i); 
     assertTrue(doc.getField("content") != null); 
    } 

    // cleanup 
    reader.close(); 
    searcher.close(); 
    } 

Habituellement, si les choses fonctionnent avec RAMDirectory, il sera à peu près fin de travail avec les autres. c'est-à-dire pour stocker de manière permanente votre index.
L'alternative à ceci est FSDirectory. Vous devrez prendre soin des permissions du système de fichier dans ce cas (qui n'est pas valide avec RAMDirectory)

Fonctionnellement, RAMDirectory n'a pas d'avantage sur FSDirectory (à part le fait que RAMDirectory sera visiblement plus rapide que FSDirectory). Ils ont tous les deux deux besoins différents.

  • RAMDirectory -> Mémoire primaire
  • FSDirectory -> Mémoire secondaire

assez similaire à la RAM & disque dur.

Je ne suis pas sûr de ce qui arrivera à RAMDirectory s'il dépasse la limite de mémoire. J'excepte un

OutOfMemoryException: System.SystemException

jeté.

+0

salut, merci pour votre réponse ... quel est l'avantage d'utiliser RAMDirectory sur FSDirectory? Et aussi, que faire si la taille de l'index dépasse la mémoire RAM? – Jimmy

+3

Il y a une limite de 2GM à la taille d'un objet. Si votre RAMDirecotry dépasse cela, vous obtiendrez une exception OutOfMemoryException même si vous avez beaucoup de RAM. – Barka