2016-01-17 4 views
0

J'essaie d'utiliser la bibliothèque AzureDirectory pour stocker un index Lucene.NET sur un compte Azure Cloud Storage.Bibliothèque AzureDirectory pour Lucene.NET: problèmes de performances lors de l'indexation

J'utilise les versions suivantes:

  • Microsoft.Windows.Azure.Storage 4.3.0.0
  • Lucene.Net 3.0.3.0
  • Lucene.Net.Store.Azure 3.0.5553.21100

et appeler la méthode suivante:

public void UpdateDocument(Term keyTerm, Document document, string indexName) 
{  
    using (var analyser = new StandardAnalyzer(LuceneVersion)) 
    { 
     using (var directory = new AzureDirectory(cloudStorage.GetStorageAccount(), indexName, new RAMDirectory())) 
     { 
      using (var indexWriter = new IndexWriter(directory, analyser, true, IndexWriter.MaxFieldLength.UNLIMITED)) 
      { 
       indexWriter.UpdateDocument(keyTerm, document); 
      } 
     } 
    } 
} 

Lorsque j'appelle la méthode même aussi peu que 10 fois (à partir d'un test unitaire), le temps total est d'environ 30 secondes.

J'ai essayé plusieurs changements avec l'indexeur pour voir si des gains de performance peuvent être réalisés mais jusqu'à présent rien. J'ai essayé de changer le code pour réutiliser l'indexeur et les classes de répertoire mais je me retrouve avec des verrous de fichiers. Je voulais aussi garder le code d'index éloigné de l'appelant pour garder Lucene isolée. Si je commente indexWriter.UpdateDocument(keyTerm, document); alors son responsive qui me dit c'est où la lenteur est.

Je voudrais savoir si je fais quelque chose de mal ou de manquer quelque chose ici?

Répondre

0

La méthode ci-dessus a juste besoin d'être ajustée pour mieux fonctionner avec les ressources car l'ouverture du répertoire et de l'indexeur pour chaque document était trop coûteuse. Ma méthode ajustée fonctionne bien:

public void UpdateDocumentBatch(Term keyTerm, IEnumerable<Document> documents, string indexName) 
{ 
    using (var analyser = new StandardAnalyzer(LuceneVersion)) 
    { 
     using (var directory = new AzureDirectory(cloudStorage.GetStorageAccount(), indexName, new RAMDirectory())) 
     { 
      var createIndex = !IndexReader.IndexExists(directory); 

      using (var indexWriter = new IndexWriter(directory, analyser, createIndex, IndexWriter.MaxFieldLength.UNLIMITED)) 
      { 
       indexWriter.SetRAMBufferSizeMB(100); 

       foreach (var document in documents) 
       { 
        keyTerm.Text = document.GetField(keyTerm.Field).StringValue; 

        indexWriter.UpdateDocument(keyTerm, document); 
       } 

       indexWriter.Commit(); 
      } 
     } 
    } 
}