Java 读取大文件有什么可以优化的吗? 1G-10G
在处理1G ~ 10G 的xml文件时,发现挺慢。
请问有什么可以优化的?代码上有什么注意的? 运行时有什么可以提高性能的设置码?
------解决方案--------------------要看你写的代码是否高效.办法是改进算法.
------解决方案--------------------
这个使用java.nio,并采用分段读取的方法是可以解决的。你自己上网查查吧
MappedByteBuffer inputBuffer =
new FileInputStream(file).getChannel().map(FileChannel.MapMode.READ_ONLY, 0, fileLength);//读取大文件
------解决方案--------------------
用个好点的SAX实现库
------解决方案--------------------这么大的文件肯定不能一次都读入内存~~~~~~~~
JAVA中可以使用内存映射文件来操作大文件.
最大可达2GB.
下面是个简单的示例,更具体的自己看Java API DOCS或相关资料
import java.io.*;
import java.nio.*;
import java.nio.channels.*;
public class LargeMappedFiles {
static int length = 0x8FFFFFF; // 128 Mb
public static void main(String[] args) throws Exception {
MappedByteBuffer out =
new RandomAccessFile( "test.dat ", "rw ").getChannel()
.map(FileChannel.MapMode.READ_WRITE, 0, length);
for(int i = 0; i < length; i++)
out.put((byte) 'x ');
System.out.println( "Finished writing ");
for(int i = length/2; i < length/2 + 6; i++)
System.out.print((char)out.get(i)); //read file
}
} ///
------解决方案--------------------读取的时候 分段读呗
------解决方案--------------------
你用的SAX实现是什么?JDK默认的?
apache的xerces比JDK的实现快至少30倍
------解决方案--------------------一点一点的吧?
我好像在说废话。。。
有一个东西叫google。。。
最大可达2GB.
Java code
import java.io.*;
import java.nio.*;
import java.nio.channels.*;
public class LargeMappedFiles {
static int length = 0x8FFFFFF; // 128 Mb
public static void main(String[] args) throws Exception {
MappedByteBuffer out =
new RandomAccessFile( "test.dat ", "rw ").getChannel()
.map(FileChannel.MapMode.READ_WRITE, 0, length);
for(int i = 0; i < length; i++)
out.put((byte) 'x ');
System.out.println( "Finished writing ");
for(int i = length/2; i < length/2 + 6; i++)
System.out.print((char)out.get(i)); //read file
}
}
------解决方案--------------------
http://download.csdn.net/source/353401
NIO 入门 - IBM 教程.chm
使用nio提高io速度
------解决方案--------------------
读一点处理一点绝对不行.因为xml有起始标记.读一点的时候可能把一个标记分开到两次处理.
自己重写readLine方法,不以\r\n为结尾,以xml的结束标记为结尾.这样每读一行以正则表达式来处理绝对比所有的XML解析器要快上百倍.
------解决方案--------------------
分段?人家是要解析,不是拷贝,xml是严格要求起始标记的。楼主可以考虑下32楼的方法。