2016-12-02 4 views
0

J'ai travaillé sur une topologie Storm, j'ai lu à partir d'un fichier dans la méthode "Execute (tuple)" et java me jette un "Java .lang.OutOfMemoryError: limite de surcharge du GC dépassée ". Le programme fonctionne correctement jusqu'à ce qu'il renvoie cette erreur, en raison de l'utilisation excessive de GarbageCollector (je pense). Le même code utilisé une fois fonctionne parfaitement, le problème est l'accord extrême de mon implémentation Storm. Je pense que c'est parce que le programme passe trop de temps sur le garbage collector, et la façon dont je l'ai programmé, je pense qu'il crée beaucoup de lecteurs pour le même fichier et Bolt chaque fois qu'il exécute un tuple. Je me demandais s'il est possible de lire le fichier dans la méthode "Prepare()", enregistrez-le dans un tableau String, et si oui, je demande: cela créerait-il seulement un lecteur et un tableau String pour une occurrence Bolt?Tempête de lecture des fichiers jette "Java.lang.OutOfMemoryError: GC overhead limite dépassée"

Voici un échantillon de mon Bolt:

public static class FilterSomeBolt extends BaseRichBolt { 
     OutputCollector _collector; 

     public void prepare(Map conf, TopologyContext context, OutputCollector collector) { 
      _collector = collector; 
     } 

     public void execute(Tuple tuple) { 

      String entr = tuple.getString(1); 

      boolean flagRet=false; 

      try { 
       String fileName2 = (String)"file.csv"; 
       BufferedReader reader2 = new BufferedReader(new FileReader(fileName2)); 
       // read and ignore the header if one exists 

      String line2 =reader2.readLine(); 
      while(line2!= null){ 
        if(line2.toLowerCase().contains("something")&&line2.toLowerCase().contains(entr.substring(1, 8).toLowerCase())){ 

         flagRet=true; 
        }//end if 
      line2 =reader2.readLine(); 

     }//end while 
}.......................... 
............................//tuple sent 

J'essaie de comprendre ces méthodes, et apprécierait l'aide. Merci d'avance!

Répondre

0

Votre logique de lecture de fichier crée le problème. Si la première ligne du fichier n'est pas nulle alors votre boucle while s'exécutera un nombre infini de fois. S'il vous plaît mettre à jour suivant extrait de code:

while((line2 =reader2.readLine())!= null){ 
    ....//do anything you want 
} 

Hope this helps.

+0

Désolé, je n'ai pas mis la mise à jour de line2, mais c'est là, je vais éditer la question, le bucle finit juste, l'erreur n'est pas là, merci! – Amnor

+0

maintenant le temps est comme celui que j'ai, je coupais un peu de code que maintenant je ne pose pas le problème et j'ai raté la mise à jour de la variable "line2", merci pour les heads up! – Amnor

+0

Aidé parce que j'ai manqué de poster le "line2" mise à jour sur la question, mais ce n'est pas la solution d'où mon code a réellement cette mise à jour de la ligne en elle. J'apprécie l'aide, mais la question demeure, donc j'ai mis votre réponse à zéro, mais je ne peux pas l'accepter comme correct parce que vous avez aidé dans la publication des questions, mais pas dans la programmation, pour accepter une question, problème de programmation. Merci pour votre aide réalisant que j'ai oublié la mise à jour line2 sur le poste, de toute façon :) – Amnor