Java 读取大文件有什么可以优化的吗? 1G-10G

scbb 2009-02-02 03:23:46
在处理1G ~ 10G 的xml文件时,发现挺慢。

请问有什么可以优化的?代码上有什么注意的? 运行时有什么可以提高性能的设置码?
...全文
1374 43 打赏 收藏 转发到动态 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
stonehigher125 2012-08-02
  • 打赏
  • 举报
回复
读取3G的文件都没问题
private static void test1() throws IOException {
System.out.println("start..");
long start = System.currentTimeMillis();
int buffersize = 1024 * 1024;
OutputStream outputStream = new FileOutputStream(new File("f:/test1.rar"));
InputStream isInputStream = new FileInputStream(new File("d:\\hahaha.rar"));
byte[] buffer = new byte[buffersize];
int readCount = 0;
while ((readCount = isInputStream.read(buffer, 0, buffersize)) > 0) {
// System.out.println(readCount);
outputStream.write(buffer, 0, readCount);

}
outputStream.close();
isInputStream.close();
System.out.println("end.." + (System.currentTimeMillis() - start) / 1000.0 + "s");

}
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 melody1128 的回复:]
一点一点的吧?
我好像在说废话。。。

有一个东西叫google。。。
最大可达2GB.

Java code

import java.io.*;
import java.nio.*;
import java.nio.channels.*;
public class LargeMappedFiles {
static int length……
[/Quote]
麻烦你把别人的帖过来也要解释一下好不好,到处乱抄,我找了好多基本就两个版本,这个版本我都不知道他的目的是什么,达到一个什么样的效果,其实我们在读文本文件的时候不光是要读他,我们更重要的是读了以后对他进行操作,也就是说二进制文件对我们来说是没用的,我们一定要转成字符型的,对于大文件来说用内存映射是没错的,但这个东西在实际操作的时候是有些问题的,我最近有一个这样的问题,反正才40多M他就不动了,用eclipse就没反应了,后来我就把他拆分开来,但是有一个问题出现了,有时本来是一个完整的字符串,一拆开来读就有可能把这个字符串拆成两面部分了。我有一个题目,是我公司的一道考试题我贴出来大家看看。
移动公司准备针对已经发放出去的139段电话号码进行统计
统计方式为每天将所有已经发放出去的电话进行排序(包括以前发放的和当天发放的号码,合并后进行排序), 排序方式为升序。
并将结果写入至c:\test\result.txt文件中。

在c:\test下有current.txt,内容为至前一天为止的全部发放出去的电话号码的文本文件,每个号码一行。
today.txt中为当天发放的手机号码(139号段),结果请写入result.txt文件中。

电话号码为13900000000, 13912345678, ... 长度为11个数字字符[0至9]


提示:电话号码可能非常多,请考虑程序的可执行性及效率。
编程过程中,可以使用apache commons包中的api (这个建议与考查的内容无关, 至少便于对处理文件关闭进行处理,评分是不会有任何影响)
除以上包以外,请使用j2se6.0的标准内容。引入其他第3方库并不符合考试要求。
axman 2009-02-13
  • 打赏
  • 举报
回复
从整个方案而言这肯定是下三流的方案。一天的log有1-10G那你不能按小时来写log吗?而且每小时的log先预处理一下。

而本贴的主题不是如何产生log,有可能这个log就是客户给你的,如何产生你控制不了。现在就是一个1-10G的文件,要想处理。

每一行log肯定有开始和结束标记。比如<log>any</log>
现在要重 写readLine,就是读到</log>说明读完了一行。然后对这一行进行分解。这是最快的方案,其它任何xml解释器在读10G文件时都是死路一条。
gengzhw 2009-02-13
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 wyquan101 的回复:]
log?谁设计的,log都写到一个文件里啊?
不按照大小分割啊。
[/Quote]
生产环境下应用服务器的日志经常很大的,
wyquan101 2009-02-13
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 scbb 的回复:]
谢谢楼上各位的回答,

目前用的是org.xml.sax.XMLReader 在做xml解析, 目前只试过512m大小的文件。

org.xml.sax.XMLReader 对于使用它自己还有什么可以优化的吗?

xml是某东西的log,所以会很大。
[/Quote]
log?谁设计的,log都写到一个文件里啊?
不按照大小分割啊。
xueshengshuyan 2009-02-11
  • 打赏
  • 举报
回复
学习,帮顶
luojihaidao 2009-02-11
  • 打赏
  • 举报
回复
学习!!! 顺便留个脚印。
酒剑仙 2009-02-11
  • 打赏
  • 举报
回复
学习
同意LS 和LSS的做法!
hbwhwang 2009-02-11
  • 打赏
  • 举报
回复
你是要对这个XML做什么动作?
如果只是解析,那么建议你采用32楼的办法,自己写专用的解析器,比通用的要快多了
axman 2009-02-11
  • 打赏
  • 举报
回复
读一点处理一点绝对不行.因为xml有起始标记.读一点的时候可能把一个标记分开到两次处理.

自己重写readLine方法,不以\r\n为结尾,以xml的结束标记为结尾.这样每读一行以正则表达式来处理绝对比所有的XML解析器要快上百倍.
爱摸鱼de老邪 2009-02-11
  • 打赏
  • 举报
回复
分段?人家是要解析,不是拷贝,xml是严格要求起始标记的。楼主可以考虑下32楼的方法。
yqlx521 2009-02-11
  • 打赏
  • 举报
回复
jinlai xuexi 进来学习
Landor2004 2009-02-08
  • 打赏
  • 举报
回复
http://download.csdn.net/source/353401
NIO 入门 - IBM 教程.chm

使用nio提高io速度
swoky 2009-02-07
  • 打赏
  • 举报
回复
靠,存的电影啊
kukufly 2009-02-06
  • 打赏
  • 举报
回复
读取xml 恩 帮你顶了
Alien 2009-02-06
  • 打赏
  • 举报
回复
文件确实挺大的,如二楼所说,那样应该是可以解决的
scbb 2009-02-06
  • 打赏
  • 举报
回复

XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");



XMLReaderFactory.createXMLReader();


上面2种都试了下,貌似速度上没有什么区别,几乎完全一样。
(当然第2种的时候,我把xercesImpl.jar删除了,应该是用了jdk标准的了吧?)
是不是我写的有问题?
scbb 2009-02-05
  • 打赏
  • 举报
回复
u
p
zhanghe086 2009-02-03
  • 打赏
  • 举报
回复
这么大的文件,没试过
scbb 2009-02-03
  • 打赏
  • 举报
回复
我试了下,xerces和标准jdk的。
貌似读100M的文件的时间几乎一样。
难道jdk就是用xerces?
加载更多回复(23)

62,616

社区成员

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

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