各位大虾:
    现有一个每行固定格式的.txt文本,我需要每行进行解析、处理并导入数据库。
    我采用的是readline的方式处理。
    当行数不多时,还可以。
    当行数多时,内存占用大,效率低。
    请问如何处理更合理?
    谢谢先

解决方案 »

  1.   

    关注
    ps:有时候String 用StringBuffer会好点
      

  2.   

    不知道...Java就是这个毛病...MARK, 不过你的文本文件多大啊? 我以前处理过50MB的文本, 还好啊.
      

  3.   

    请问你50m文本都是先读入内存,再一行一行处理吗?
    String StringBuffer是问题的关键吗?我想关键是如何处理文本,如分段处理等
      

  4.   

    仅供参考:    File file = new File("filename");
        BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file),10*1024*1024); // 用10M的缓冲读取
        BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
      

  5.   

    你用nio包里的输入输出试一下呢?感觉瓶颈是IO的事情
      

  6.   

    JAVA的处理能力没有那么差,而且几十M的文件应该不算大。当然你不能指望用台486就能轻松高效处理,必要的硬件要求也是要有的。
      

  7.   

    要看你的处理是怎样的?比如说,是一行一行的放进数据库呢,
    还是处理完成后放在集合中最后一起放到数据库中。如果存储结构、算法得当的话,可以大大地减少内存堆的占用。如果在存储结构和算法上没有办法进行考虑的话,可以使用:java -Xmx 来扩大内存堆的容量,默认是64MB。在32位体系
    结构下理论的最大值是2G,实际上最大在1.2G左右。
      

  8.   

    但我的文件至少都是30m以上,那如何处理?我给的代码是占用10M的缓冲,也就是说,无论你读取多大的文件,他只占用大约10M的内存空间进行处理。他会自动从文件里面读取剩余部分的。
    你的代码只需要继续 readLine(), 就行了。
      

  9.   

    不知道楼主的数据库是什么哈?
    如果对文件中记录没太多的业务逻辑判断的话,然后数据库又是oracle的话完全可以用sql loader工具来导入数据。
    性能上应该没多大问题。
      

  10.   

    瓶颈不是io,而是不断的数据库插入操作。
    建议使用数据库支持的批量操作方式。
    例如bcp,import,dts等方式。
      

  11.   

    操作文本和数据库,我想可以使用Perl语言,因为这是她的拿手好戏。不知道这算不算另辟蹊径?
      

  12.   

    这是思路,你可以自己改改再用import java.io.*;
    import java.sql.*;public class ReadFromFile {/**
    * 以行为单位读取文件,常用于读面向行的格式化文件
    * @param fileName 文件名
    */
    public static void readFileByLines(String fileName){
    File file = new File(fileName);
    BufferedReader reader = null;
    try {
    //--------------------------------------------------------------------------
    Connection con;
    Statement stmt;
    ResultSet rs;
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//改成你的驱动
    con = DriverManager.getConnection("jdbc:odbc:meritlinedb");//改成你的DB
    PreparedStatement pstmt=con.prepareStatement("insert into sale (id,name,sex) values(?,?,?)");//用PreparedStatement,速度快十倍
    //--------------------------------------------------------------------------

    System.out.println("以行为单位读取文件内容,一次读一整行:");
    reader = new BufferedReader(new FileReader(file));
    String tempString = null;
    int line = 1;
    //一次读入一行,直到读入null为文件结束
    while ((tempString = reader.readLine()) != null){
    //显示行号
    System.out.println("line " + line + ": " + tempString);//这里可以放你要处理的字符串的语句
    xxxx1="";
    xxxx2="";
    xxxx3="";//用你自己的方法得到这三个(xxxx1,xxxx2,xxxx3)
    //--------------------------------------------
    pstmt.setString(1,xxxx1);
    pstmt.setString(2,xxxx2);
    pstmt.setString(3,xxxx3);
    pstmt.executeUpdate();//写入数据库
    //--------------------------------------------
    line++;
    }
    reader.close();
    } catch (IOException e) {
    e.printStackTrace();
    } finally {
    if (reader != null){
    try {
    reader.close();
    } catch (IOException e1) {
    }
    }
    }
    }public static void main(String[] args) {
    String fileName = "C:/temp.txt";
    ReadFromFile.readFileByLines(fileName);
    }
    }