用Eclipse编写了一个程序,涉及到在文本文件中读取数据进行处理,数据量一超过就会提示java.lang.OutOfMemoryError,减少数据量就没问题,我已经扩展了2G内存,请问如何让我的程序能够使用更多的内存去执行?我试过设置eclipse的eclipse.ini中的
-vmargs
-Xms512m
-Xmx1024m
这样改了还是不行。。请问这个问题怎么解决
-vmargs
-Xms512m
-Xmx1024m
这样改了还是不行。。请问这个问题怎么解决
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;public class C3data { /**
* @param args
*/
static ArrayList countrys = new ArrayList();
static ArrayList kinds = new ArrayList();
static ArrayList names = new ArrayList();
public static ArrayList c3Country() {
ArrayList country = new ArrayList();
String line;
try {
BufferedReader reader = new BufferedReader(new FileReader(
"1561C3数据-国别.txt"));
while ((line = reader.readLine()) != null) {
// System.out.println(line);
country.add(line.trim());
}
reader.close(); } catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return country;
}
public static ArrayList c3Kind() {
ArrayList kind = new ArrayList();
String line;
try {
BufferedReader reader = new BufferedReader(new FileReader(
"1561C3数据-机构类型.txt"));
while ((line = reader.readLine()) != null) {
// System.out.println(line);
kind.add(line.trim());
}
reader.close(); } catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return kind;
}
public static ArrayList c3Name() {
ArrayList name = new ArrayList();
String line;
try {
BufferedReader reader = new BufferedReader(new FileReader(
"1561C3数据-机构名称.txt"));
while ((line = reader.readLine()) != null) {
// System.out.println(line);
name.add(line.trim());
}
reader.close(); } catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return name;
}
public static ArrayList nameTotals() {
ArrayList nametotals = new ArrayList();
ArrayList nametotal,nametotalmapping;
String name, oricode, sid, country, lang, type, kind;
readExcel();
if (names.size() != kinds.size()) {
System.out.println("样例DOCDB跟DOCBA数量不一致!");
return null;
}
if (names.size() != countrys.size()) {
System.out.println("样例DOCDB跟DOCBA数量不一致!");
return null;
}
oricode = "";
sid = "";
lang = "ZH";
type = "C3";
nametotalmapping = new ArrayList();
for (int i = 0; i < names.size(); i++) {
name = (String) names.get(i);
if(nametotalmapping.contains(name)){
continue;
}
nametotalmapping.add(name);
nametotal = new ArrayList();
country = (String)countrys.get(i);
kind = (String)kinds.get(i);
nametotal.add(name);
nametotal.add(oricode);
nametotal.add(sid);
nametotal.add(country);
nametotal.add(lang);
nametotal.add(type);
nametotal.add(kind);
nametotals.add(nametotal);
}
return nametotals;
}
}5个文本文件中都含有6万条数据,这才是其中一个类。我一共有5个这样的类,一次性运算,中数据量达到30万条数据
package zlqrdmjg;import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;public class Cndata {
/**
* @param args
*/
static ArrayList countrys = new ArrayList();
static ArrayList names_zh = new ArrayList();
static ArrayList names = new ArrayList();
static ArrayList names_en = new ArrayList();
static ArrayList kinds = new ArrayList();
static ArrayList oricodes = new ArrayList();
public static ArrayList cnOricode() {
ArrayList oricode = new ArrayList();
String line;
try {
BufferedReader reader = new BufferedReader(new FileReader(
"jigedaima.TXT"));
while ((line = reader.readLine()) != null) {
// System.out.println(line);
oricode.add(line.trim());
}
reader.close(); } catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return oricode;
}
public static ArrayList cnCountry() {
ArrayList country = new ArrayList();
String line;
try {
BufferedReader reader = new BufferedReader(new FileReader(
"guobie.TXT"));
while ((line = reader.readLine()) != null) {
// System.out.println(line);
country.add(line.trim());
}
reader.close(); } catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return country;
}
public static ArrayList cnName_en() {
ArrayList name_en = new ArrayList();
String line;
try {
BufferedReader reader = new BufferedReader(new FileReader(
"ywmc.TXT"));
while ((line = reader.readLine()) != null) {
// System.out.println(line);
name_en.add(line.trim());
}
reader.close(); } catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return name_en;
}
public static ArrayList cnName_zh() {
ArrayList name_zh = new ArrayList();
String line;
try {
BufferedReader reader = new BufferedReader(new FileReader("zwmc.TXT"));
while ((line = reader.readLine()) != null) {
// System.out.println(line);
name_zh.add(line.trim());
}
reader.close(); } catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return name_zh;
}
public static ArrayList cnKind() {
ArrayList kind = new ArrayList();
String line;
try {
BufferedReader reader = new BufferedReader(new FileReader(
"leixing.TXT"));
while ((line = reader.readLine()) != null) {
// System.out.println(line);
kind.add(line.trim());
}
reader.close(); } catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return kind;
}
public static HashMap getNames(String name_en,String name_zh){
HashMap namemap = new HashMap();
String[] names_en = name_en.split(";");
String[] names_zh = name_zh.split(";");
for(int i = 0;i < names_en.length;i++){
if(!names_en[i].equals(""))
namemap.put(names_en[i],"EN" );
}
for(int i = 0;i < names_zh.length;i++){
if(!names_zh[i].equals(""))
namemap.put(names_zh[i],"ZH" );
}
return namemap;
}
public static ArrayList nameTotals() {
ArrayList nametotals = new ArrayList();
ArrayList nametotal;
HashMap namemap;
String name,oricode, sid, country, lang, type, kind;
//readExcel();
sid = "";
type = "CN";
oricodes = cnOricode();
countrys = cnCountry();
kinds = cnKind();
names_en = cnName_en();
names_zh = cnName_zh();
for (int i = 0; i < oricodes.size(); i++) {
oricode = (String) oricodes.get(i);
country = (String) countrys.get(i);
kind = (String) kinds.get(i);
//namemap = (HashMap) names.get(i);
namemap = getNames((String)names_en.get(i),(String)names_zh.get(i));
Set keyset = namemap.keySet();
Iterator iter = keyset.iterator();
while (iter.hasNext()) {
nametotal = new ArrayList();
name = (String)iter.next();
lang = (String)namemap.get(name);
nametotal.add(name);
nametotal.add(oricode);
nametotal.add(sid);
nametotal.add(country);
nametotal.add(lang);
nametotal.add(type);
nametotal.add(kind);
nametotals.add(nametotal);
}
}
return nametotals;
}
}是这个,上面的那段代码有问题
说的设置应用程序内存能说具体一点吗?我没看到里面有设置这个的啊
你给的两段代码里所有的reader.close()都要这样修改
还有,你使用jml操作了excel,那些workbook最终close了没?
点开run,就可以看见配置页面,选择Arguments,然后在VM Arguments里面就可以输入你的虚拟机参数了
如果你确认了,这个参数确实是你设置的值,那么你就得检查你的代码了,据我的经验1G的内存能够存放的数据量,一般是很难达到的。故你经常溢出,很可能就是你代码写的有问题。