通过接口获取大量数据,内存溢出的问题

lup_work 2011-07-18 04:22:53
通过一个连接获取xml数据,但是数据量过大,导致了内存溢出,有没有解决方法呢?
代码如下:
HttpClient client = new HttpClient();

GetMethod get = new GetMethod(" http://*****");
//使用系统提供的默认的恢复策略
get.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
new DefaultHttpMethodRetryHandler());

try {
//执行getMethod
int statusCode = client.executeMethod(get);
if (statusCode != HttpStatus.SC_OK){
System.err.println("Method failed: "
+ get.getStatusLine());
}
System.out.println("charset=" +get.getResponseCharSet());

client.executeMethod(get);


InputStream is = get.getResponseBodyAsStream();
in = new BufferedReader(new InputStreamReader(is,"gb2312"));
String str = null;
while ((str = in.readLine()) != null) {
System.out.println(str);
}
当执行到 while ((str = in.readLine()) != null) {
就报内存溢出了,说明一下,url返回的数据量比较大,大量有上万条记录,是xml形式的,各位高手给出个处理方法把,一天没搞定了。。。。
...全文
1655 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
lup_work 2011-07-19
  • 打赏
  • 举报
回复
int length=0;
byte[] buf = new byte[1024];
while ((length = is.read(buf)) >= 0) {
System.out.println(new String(buf));
}

我使用这种方法打印的话,为什么只出来一个xml的很少一部分,然后就报连接失败了
liuzhengkang 2011-07-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lup_work 的回复:]

引用 8 楼 wangjn1982 的回复:
Java code


length = is.read(buf))


这句代码就是把流中的数据读取到buf中,length是长度
while中的代码是把读取的数据进行业务处理


我要打印出来我接收到的数据,怎么打印??
int length=0;
byte[] buf = new byte[1024];
while ……
[/Quote]


int length=0;
byte[] buf = new byte[1024];
while ((length = is.read(buf)) >= 0) {
System.out.println(new String(buf));
}

jnhcd 2011-07-19
  • 打赏
  • 举报
回复
大数据量直接放在内存中当然会溢出了,分块吧,具体怎么分,看项目
hchjjun 2011-07-19
  • 打赏
  • 举报
回复
应该分页读取好呀
zousir18 2011-07-19
  • 打赏
  • 举报
回复
学习...
lup_work 2011-07-19
  • 打赏
  • 举报
回复
现在是返回结果都拿不到啊,返回的太大,已经内存溢出了。有做过可否给力处理的例子。。。
wuly505 2011-07-19
  • 打赏
  • 举报
回复
利用org.w3c.dom.Document分段读取xml处理
xiajun868 2011-07-19
  • 打赏
  • 举报
回复
你们的项目思路应该有问题,几万个xml文件通过一次接口调用把内容全部返回有多大我就不想说了。你还把它放到string里,不是撑死它吗!如果你们是调用别人webservice接口,可以试一下大文件下载的方式。返回字符串是行不通的。
liuzhengkang 2011-07-19
  • 打赏
  • 举报
回复
测试下。


public static void main(String[] args) {
//
try {
readFile("D:\\work\\test\\src\\log4j.properties");
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}

public static void readFile(String fileName) throws Exception{
File file = new File(fileName);
BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
int length=0;
byte[] buf = new byte[1024];
while ((length = in.read(buf)) != -1) {
System.out.println(new String(buf,0,length));
}
}

bestjfliu 2011-07-18
  • 打赏
  • 举报
回复
不要使用字符串,拿到返回结果后,直接构造一个XML。
lup_work 2011-07-18
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 bjliuzg 的回复:]
读取他的文件涉及到操作他本地文件了,所以你可以先把你要读取的文件在他本地建一个临时文件夹,分成N个小文件,之后根据分割的文件个数循环读取,之后保存到你本地,再合并文件,之后读取本地的文件就可以了,这样做是比较合理的。你认为呢?我之前做过,所以可行性是没问题的,就看符合不符合你的业务要求了。
[/Quote]
这个跟我现在做的不一样吧,我是通过url接口读取他的数据,我是控制不了对方的数据的,我只能得到对方的数据,然后存在我的数据库里
bjliuzg 2011-07-18
  • 打赏
  • 举报
回复
读取他的文件涉及到操作他本地文件了,所以你可以先把你要读取的文件在他本地建一个临时文件夹,分成N个小文件,之后根据分割的文件个数循环读取,之后保存到你本地,再合并文件,之后读取本地的文件就可以了,这样做是比较合理的。你认为呢?我之前做过,所以可行性是没问题的,就看符合不符合你的业务要求了。
lup_work 2011-07-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wangjn1982 的回复:]
Java code


length = is.read(buf))


这句代码就是把流中的数据读取到buf中,length是长度
while中的代码是把读取的数据进行业务处理
[/Quote]

我要打印出来我接收到的数据,怎么打印??
int length=0;
byte[] buf = new byte[1024];
while ((length = is.read(buf)) >= 0) {
System.out.println(buf[length]);
}
这样貌似不对哦??
lup_work 2011-07-18
  • 打赏
  • 举报
回复
现在是通过url,把客户那边的xml数据读过来,然后解析入库,我现在仅仅读取就读不出来了,哎,愁死我了,
Gray_Sky 2011-07-18
  • 打赏
  • 举报
回复
客户给的xml你不解析就直接读取出来应该是没有意义的呀

如果文件过大,应该用ftp传送,或者做文件切割。用流的方式做不是很明智。

有点跑题了,楼主的溢出有可能是过去频繁的操作String对象导致,可以先修改一下jvm内存设置试试。
wangjn1982 2011-07-18
  • 打赏
  • 举报
回复

length = is.read(buf))

这句代码就是把流中的数据读取到buf中,length是长度
while中的代码是把读取的数据进行业务处理
lup_work 2011-07-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zn85600301 的回复:]
我觉得一次接受这么大的数据 本身就有问题

为什么不能类似分页的去获取数据呢
[/Quote]

这个没有办法啊,我们客户给我们的就是这样的数据,xml里面的大约有上个玩航班信息
lup_work 2011-07-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wangjn1982 的回复:]
Java code


in = new BufferedInputStream(new FileInputStream(src), BUFFER_SIZE);
byte[] buffer = new byte[1024]
int len = 0;
while ((len = in.read(buffer)) > 0) {
....
}
[/Quote]

不好意思,这个我还是不知道怎么写,我对io流不太懂,while里面怎么读取呢
zn85600301 2011-07-18
  • 打赏
  • 举报
回复
我觉得一次接受这么大的数据 本身就有问题

为什么不能类似分页的去获取数据呢
wangjn1982 2011-07-18
  • 打赏
  • 举报
回复

InputStream is = get.getResponseBodyAsStream();
byte[] buf = new byte[1024];
while ((length = is.read(buf)) >= 0) {
....
}

buf中就是读取的字节流
加载更多回复(3)

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧