try {
// CompareRecord record = new CompareRecord();
Connection conn = new CompareRecord().getConection("eliteddaprd","eliteddaprd","192.168.14.104","1521");
ResultSet res = null;
if (conn != null){
Statement stmt = conn.createStatement();
res = stmt.executeQuery("select rowindx,ADDRLINE1 from dedupinitial order by rowindx");
}
Map<Integer,String> adddressMap = new LinkedHashMap<Integer, String>();
if (res != null){
System.out.println("result set is not null ");
while(res.next()){
adddressMap.put(res.getInt(1),res.getString(2));
}
}
System.out.println("address Map size =========> "+adddressMap.size());
Iterator it = adddressMap.entrySet().iterator();
int count = 0;
int min = 0;
while (it.hasNext()){
Map.Entry pairs = (Map.Entry)it.next();
Pattern p = Pattern.compile("[,\\s]+");
Integer outerkey = (Integer)pairs.getKey();
String outerValue = (String)pairs.getValue();
//System.out.println("outer Value ======> "+outerValue);
String[] outerresult = p.split(outerValue);
Map.Entry pairs2 = null;
count++;
List<Integer> dupList = new ArrayList<Integer>();
Iterator innerit = adddressMap.entrySet().iterator();
boolean first = true;
while (innerit.hasNext()){
//System.out.println("count value ===> "+count);
int totmatch = 0;
if(first){
if(count == adddressMap.size()){
break;
}
for(int i=0;i<=count;i++){
pairs2 = (Map.Entry)innerit.next();
}
first = false;
}
else{
pairs2 = (Map.Entry)innerit.next();
}
Integer innterKey = (Integer)pairs2.getKey();
String innerValue = (String)pairs2.getValue();
//System.out.println("innrer value "+innerValue);
String[] innerresult = p.split(innerValue);
for(int j=0;j<outerresult.length;j++){
for(int k=0;k<innerresult.length;k++){
if(outerresult[j].equalsIgnoreCase(innerresult[k])){
//System.out.println(outerresult[j]+" Match With "+innerresult[k]);
totmatch++;
break;
}
}
}
min = Math.min(outerresult.length, innerresult.length);
if(min != 0 && ((totmatch*100)/min) > 50) {
//System.out.println("maching inner key =========> "+innterKey);
dupList.add(innterKey);
}
}
//System.out.println("Duplilcate List Sisze ===================> "+dupList.size()+" "+outerkey);
}
System.out.println("End =========> "+new Date());
}
catch (Exception e) {
e.printStackTrace();
}
Ici ResultSet a traité environ 500 000 enregistrements, mais cela me donnera une erreur comme:
Exception in thread "main" Java.lang.OutOfMemoryError: Java heap space
at Java.util.HashMap.resize(HashMap.Java:508)
at Java.util.LinkedHashMap.addEntry(LinkedHashMap.Java:406)
at Java.util.HashMap.put(HashMap.Java:431)
at spite.CompareRecord.main(CompareRecord.Java:91)
Je sais que cette erreur vient de la mémoire de VM, mais je ne sais pas comment l'augmenter dans Eclipse?
Que dois-je faire si je dois traiter plus de 500 000 enregistrements?
Dans Exécuter-> Exécuter la configuration, recherchez le nom de la classe que vous avez exécutée, sélectionnez-la, cliquez sur l'onglet Arguments, puis ajoutez:
-Xms512M -Xmx1524M
dans la section VM Arguments
Dans le dossier de téléchargement Eclipse, entrez les données dans le fichier Eclipse.ini
:
--launcher.XXMaxPermSize
512M
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms512m
-Xmx1024m
ou quelles que soient les valeurs que vous voulez.
Voir http://blog.headius.com/2009/01/my-favorite-hotspot-jvm-flags.html
-Xms et -Xmx définissent les tailles minimale et maximale du segment de mémoire. Présentée comme une fonctionnalité, Hotspot met un plafond sur la taille du segment de mémoire pour l'empêcher de détruire votre système. Ainsi, une fois que vous avez déterminé la mémoire maximale dont votre application a besoin, vous la limitez pour empêcher le code non autorisé d’affecter d’autres applications. Utilisez ces indicateurs tels que -Xmx512M, où M correspond à MB. Si vous ne l'incluez pas, vous spécifiez des octets. Plusieurs drapeaux utilisent ce format. Vous pouvez également obtenir une amélioration mineure au démarrage en augmentant le minimum, car il n’est pas nécessaire que le tas grossisse immédiatement.
-XX: MaxPermSize = ### M définit la taille maximale de "génération permanente". Hotspot est inhabituel dans la mesure où plusieurs types de données sont stockés dans la "génération permanente", une zone distincte du tas qui est rarement (ou jamais) collectée. La liste des données hébergées de façon permanente est un peu floue, mais elle contient généralement des éléments tels que les métadonnées de classe, le bytecode, les chaînes internées, etc. (et cela varie certainement d'une version à l'autre de Hotspot). Parce que cette génération est rarement ou jamais collectée, vous devrez peut-être augmenter sa taille (ou activer le balayage permanent avec quelques autres drapeaux). Dans JRuby en particulier, nous générons beaucoup de bytecode d'adaptateur, qui demande généralement plus d'espace permanent.
Comment donner plus de mémoire à votre programme lors de l'exécution d'Eclipse
Aller à Exécuter/Exécuter les configurations. Sélectionnez la configuration d'exécution pour votre programme. Cliquez sur l'onglet "Arguments". Dans la zone "Arguments du programme", ajoutez un argument -Xmx
, par exemple -Xmx2048m
pour donner à votre programme un max. de 2048 Mo (2 Go) de mémoire.
Comment prévenir ce problème de mémoire
Réécrivez votre programme de telle sorte qu'il n'ait pas besoin de stocker autant de données en mémoire. Je n'ai pas examiné votre code en détail, mais il semble que vous stockiez beaucoup de données dans un HashMap
il ne reste plus que de la mémoire lorsque vous avez beaucoup d'enregistrements.
Vous voudrez peut-être fermer les projets ouverts dans votre explorateur de projets. Vous pouvez le faire en cliquant avec le bouton droit de la souris sur un projet ouvert et en sélectionnant "Fermer le projet".
C'est ce qui a fonctionné pour moi après avoir constaté que je devais régulièrement augmenter la taille du segment de mémoire dans mon répertoire\Eclipse\eclipse.ini.
J'espère que cela t'aides! Paix!
Dans le fichier Eclipse.ini, saisissez les entrées ci-dessous.
-Xms512m
-Xmx2048m
-XX: MaxPermSize = 1024m
Pour augmenter la taille de segment de mémoire dans Eclipse, modifiez le fichier Eclipse.ini.
faire référence à
http://wiki.Eclipse.org/FAQ_How_do_I_increase_the_heap_size_available_to_Eclipse%3F
Vous pouvez augmenter la taille de la mémoire en utilisant des arguments en ligne de commande.
Voir ce lien .
Eclipse -vmargs -Xmx1024m
Edit: Voir aussi voir cette excellente question
Allez dans "Fenêtre -> Préférences -> Général -> C/C++ -> Analyse de code" Et désactivez "Erreurs de syntaxe et de sémantique -> La classe abstraite ne peut pas être instanciée"
Je ne suis pas un pro de Java mais votre problème peut être résolu en "blockingqueue" si vous l'utilisez judicieusement.
Essayez de récupérer d’abord un bloc d’enregistrements, de les traiter et d’itérer le processus jusqu’à ce que votre traitement soit terminé. Cela peut vous aider à vous débarrasser du OutOfMemory Exceptions
.
Dans Eclipse, allez dans Exécuter -> Exécuter la configuration, recherchez le nom de la classe que vous avez exécutée, sélectionnez-la, cliquez sur l'onglet Cible, puis dans "Options de ligne de commande de l'émulateur supplémentaires", ajoutez:
-Xms512M -Xmx1524M
puis cliquez sur Appliquer.
Que faire si je dois traiter plus de 500 000 enregistrements?
Il existe plusieurs méthodes pour augmenter la taille du segment de mémoire Java de votre application, que quelques-unes ont déjà suggérées. Votre application doit supprimer les éléments de votre adddressMap au fur et à mesure que votre application y ajoute un nouvel élément. Ainsi, vous ne rencontrerez plus de mémoire s'il y a plus d'enregistrements. Recherchez le producteur-consommateur si vous êtes intéressé.
Parfois, l’exception ne s’arrête pas après l’augmentation de la mémoire dans le fichier ini d’Eclipse. alors essayez l'option ci-dessous
Sélectionnez Fenêtre >> Préférences >> MyEclipse >> Projet Java Enterprise >> Projet Web >> Onglet Deployment Sous -> Sous Stratégies de déploiement de la bibliothèque UnCheck -> Jars des bibliothèques utilisateur