Je travaille avec Lucene 2.4.0 et la JVM (JDK 1.6.0_07). Je reçois constamment OutOfMemoryError: Java heap space
, en essayant d'indexer de gros fichiers texte. Exemple 1: L'indexation d'un fichier texte de 5 Mo manque de mémoire avec un maximum de 64 Mo. taille du tas. J'ai donc augmenté le maximum. Taille du tas à 512 Mo. Cela a fonctionné pour le fichier texte de 5 Mo, mais Lucene utilisait toujours 84 Mo d'espace de tas pour le faire. Pourquoi tant?Pourquoi Lucene provoque-t-il OOM lors de l'indexation de fichiers volumineux?
La classe FreqProxTermsWriterPerField
semble être de loin le plus gros consommateur de mémoire selon JConsole et le plugin TPTP Memory Profiling pour Eclipse Ganymede.
Exemple 2: L'indexation d'un fichier texte de 62 Mo est à court de mémoire avec un maximum de 512 Mo. taille du tas. Augmenter le max. La taille du tas à 1024 Mo fonctionne mais Lucene utilise 826 Mo d'espace de tas tout en effectuant cela. Il semble encore que trop de mémoire soit utilisée pour faire cela. Je suis sûr que les fichiers plus volumineux causeraient l'erreur car elle semble corrélative.
Je suis sur une plate-forme Windows XP SP2 avec 2 Go de RAM. Alors, quelle est la meilleure pratique pour l'indexation de gros fichiers? Voici un extrait de code que j'utilise:
// Index the content of a text file.
private Boolean saveTXTFile(File textFile, Document textDocument) throws MyException {
try {
Boolean isFile = textFile.isFile();
Boolean hasTextExtension = textFile.getName().endsWith(".txt");
if (isFile && hasTextExtension) {
System.out.println("File " + textFile.getCanonicalPath() + " is being indexed");
Reader textFileReader = new FileReader(textFile);
if (textDocument == null)
textDocument = new Document();
textDocument.add(new Field("content", textFileReader));
indexWriter.addDocument(textDocument); // BREAKS HERE!!!!
}
} catch (FileNotFoundException fnfe) {
System.out.println(fnfe.getMessage());
return false;
} catch (CorruptIndexException cie) {
throw new MyException("The index has become corrupt.");
} catch (IOException ioe) {
System.out.println(ioe.getMessage());
return false;
}
return true;
}
Je trouve bizarre que FreqProxTermsWriterPerField devrait apparaître comme un gros consommateur. Lorsque vous utilisez le constructeur Field (String, Reader), comme vous l'avez fait, il ne stocke pas les vecteurs de terme. Pouvez-vous s'il vous plaît poster le code sur la façon dont vous avez initialisé IndexWriter, comment cette méthode est appelée et le post-traitement, le cas échéant. –
Voici comment j'initialise l'IndexWriter: indexWriter = new IndexWriter (indexRépertoire, new StandardAnalyzer(), createFlag, MaxFieldLength.UNLIMITED); \t \t \t \t indexWriter.setMergeScheduler (nouveau org.apache.lucene.index.SerialMergeScheduler()); \t \t \t \t indexWriter.setRAMBufferSizeMB (32); indexWriter.setMergeFactor (1000); \t indexWriter.setMaxFieldLength (Integer.MAX_VALUE); indexWriter.setUseCompoundFile (false); indexWriter.Fermer(); –
Désolé pour le formatage. Savez-vous comment je peux re-poster et obtenir les extraits de code pour ressembler à mon message original? –