日期:2014-05-20  浏览次数:21003 次

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楼的方法。