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();
}
ここで、ResultSetは約500000レコードを処理しましたが、次のようなエラーが表示されます。
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)
このエラーはVMメモリが原因で発生することは知っていますが、Eclipseでエラーを増やす方法がわかりませんか?
500,000件を超えるレコードを処理する必要がある場合はどうすればよいですか?
「実行」->「実行構成」で、実行中のクラスの名前を見つけて選択し、「引数」タブをクリックしてから追加します。
-Xms512M -Xmx1524M
VM引数セクションへ
Eclipseダウンロードフォルダで、Eclipse.ini
ファイルにエントリを作成します。
--launcher.XXMaxPermSize
512M
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms512m
-Xmx1024m
またはあなたが望むどんな値。
http://blog.headius.com/2009/01/my-favorite-hotspot-jvm-flags.html を参照してください
-Xmsおよび-Xmxは、ヒープの最小サイズと最大サイズを設定します。 Hotspotは機能として注目されており、ヒープサイズに上限を設けて、システムの破壊を防ぎます。したがって、アプリが必要とする最大メモリを把握したら、それをキャップして、不正なコードが他のアプリに影響を与えないようにします。 -Xmx512Mなどのこれらのフラグを使用します。MはMBを表します。含めない場合は、バイトを指定しています。いくつかのフラグはこの形式を使用します。また、最小値を高く設定することで、ヒープをすぐに増やす必要がないため、マイナーなスタートアップパフォーマンスブーストを得ることができます。
-XX:MaxPermSize = ### Mは、「永続的な世代」の最大サイズを設定します。ホットスポットは、いくつかのタイプのデータが「永続世代」に格納されるという点で異常です。「永続世代」は、ガベージコレクションがほとんど(またはまったく)行われないヒープの別の領域です。 perm-genがホストするデータのリストは少しあいまいですが、通常はクラスメタデータ、バイトコード、インターンされた文字列などが含まれています(これは確かにHotspotのバージョンによって異なります)。この世代はほとんど収集されないか、まったく収集されないため、サイズを大きくする必要があります(または、他のいくつかのフラグを使用してperm-genスイープをオンにします)。特にJRubyでは、多くのアダプタバイトコードを生成しますが、通常、より多くのperm genスペースが必要です。
Eclipseから実行するときにプログラムにより多くのメモリを割り当てる方法
実行/実行構成に移動します。プログラムの実行構成を選択します。 「引数」タブをクリックします。 [プログラムの引数]領域で、-Xmx
引数を追加します。たとえば、-Xmx2048m
を追加して、プログラムに最大値を与えます。 2048 MB(2 GB)のメモリ。
このメモリの問題を防ぐ方法
メモリに大量のデータを保存する必要がないように、プログラムを書き直してください。私はあなたのコードを詳細に見ていないが、あなたはHashMap
;にたくさんのデータを保存しているようだ。多くのレコードがある場合、メモリに収まりきらない。
Project Explorerで開いているプロジェクトを閉じることができます。これを行うには、開いているプロジェクトを右クリックし、「プロジェクトを閉じる」を選択します。
これは、my_directory\Eclipse\eclipse.iniのヒープサイズを定期的に増やす必要があることに気付いた後、私にとってはうまくいきました。
お役に立てれば!平和!
Eclipse.iniファイルで、以下のエントリを作成します
-Xms512m
-Xmx2048m
-XX:MaxPermSize = 1024m
Eclipseでヒープサイズを増やすには、Eclipse.iniファイルを変更します。
参照する
http://wiki.Eclipse.org/FAQ_How_do_I_increase_the_heap_size_available_to_Eclipse%3F
コマンドライン引数を使用して、メモリのサイズを増やすことができます。
このリンク を参照してください。
Eclipse -vmargs -Xmx1024m
編集: この素晴らしい質問を参照 も参照してください
「ウィンドウ->設定->一般-> C/C++->コード分析」に移動し、「構文およびセマンティクスのエラー->抽象クラスをインスタンス化できません」を無効にします。
私はJavaのプロではありませんが、賢く使用すれば、「blockingqueue」によって問題を解決できます。
最初にレコードのチャンクを取得して処理し、処理が完了するまでプロセスを繰り返します。これは、OutOfMemory Exceptions
を取り除くのに役立ちます。
Eclipseの[実行]-> [実行構成]で、実行中のクラスの名前を見つけて選択し、[ターゲット]タブをクリックして、[追加のエミュレータコマンドラインオプション]で以下を追加します。
-Xms512M -Xmx1524M
[適用]をクリックします。
500,000レコードをさらに処理する必要がある場合はどうすればよいですか?
すでにいくつか提案されているアプリのJavaヒープサイズを増やすには、いくつかの方法があります。アプリは新しい要素を追加するため、adddressMapから要素を削除する必要があります。そのため、さらにレコードが入ってきても大丈夫です。興味がある場合は、プロデューサーとコンシューマーを探してください。
Eclipseのiniファイルのメモリを増やしても、例外が停止しない場合があります。次にオプションを試してください
ウィンドウ>>環境設定>> MyEclipse >> Java Enterprise Project >> Web Project >> Deployment Tabの下-> Library Deployment Policies UnCheck-> Jars from User Librariesに移動します