JAVA处理大文本.txt的问题 各位大虾: 现有一个每行固定格式的.txt文本,我需要每行进行解析、处理并导入数据库。 我采用的是readline的方式处理。 当行数不多时,还可以。 当行数多时,内存占用大,效率低。 请问如何处理更合理? 谢谢先 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 关注ps:有时候String 用StringBuffer会好点 不知道...Java就是这个毛病...MARK, 不过你的文本文件多大啊? 我以前处理过50MB的文本, 还好啊. 请问你50m文本都是先读入内存,再一行一行处理吗?String StringBuffer是问题的关键吗?我想关键是如何处理文本,如分段处理等 仅供参考: File file = new File("filename"); BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file),10*1024*1024); // 用10M的缓冲读取 BufferedReader reader = new BufferedReader(new InputStreamReader(fis)); 你用nio包里的输入输出试一下呢?感觉瓶颈是IO的事情 JAVA的处理能力没有那么差,而且几十M的文件应该不算大。当然你不能指望用台486就能轻松高效处理,必要的硬件要求也是要有的。 要看你的处理是怎样的?比如说,是一行一行的放进数据库呢,还是处理完成后放在集合中最后一起放到数据库中。如果存储结构、算法得当的话,可以大大地减少内存堆的占用。如果在存储结构和算法上没有办法进行考虑的话,可以使用:java -Xmx 来扩大内存堆的容量,默认是64MB。在32位体系结构下理论的最大值是2G,实际上最大在1.2G左右。 但我的文件至少都是30m以上,那如何处理?我给的代码是占用10M的缓冲,也就是说,无论你读取多大的文件,他只占用大约10M的内存空间进行处理。他会自动从文件里面读取剩余部分的。你的代码只需要继续 readLine(), 就行了。 不知道楼主的数据库是什么哈?如果对文件中记录没太多的业务逻辑判断的话,然后数据库又是oracle的话完全可以用sql loader工具来导入数据。性能上应该没多大问题。 瓶颈不是io,而是不断的数据库插入操作。建议使用数据库支持的批量操作方式。例如bcp,import,dts等方式。 操作文本和数据库,我想可以使用Perl语言,因为这是她的拿手好戏。不知道这算不算另辟蹊径? 这是思路,你可以自己改改再用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);}} 求教达人:java中如何得到一个二进制数的哪几位是1,要求不用遍历数位? 怎么把 一个方法中的JTextField 局部变量传递到下一个方法进行修改 条件是:不用全局变量!!! JAVA类的初始化 请高手讲解单例模式并举出一个例子 jsp接收邮件,管理邮件 JAVA混淆器设计 只剩9分可用手了,大家进来看看。 如何将剪贴板中的内容复制到String变量中 java编程如何得到.html文件? 我用java能做出共享软件吗??能做象什么样的呢? 线性搜索的问题... Java中一道怪异的for循环语法问题
ps:有时候String 用StringBuffer会好点
String StringBuffer是问题的关键吗?我想关键是如何处理文本,如分段处理等
BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file),10*1024*1024); // 用10M的缓冲读取
BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
还是处理完成后放在集合中最后一起放到数据库中。如果存储结构、算法得当的话,可以大大地减少内存堆的占用。如果在存储结构和算法上没有办法进行考虑的话,可以使用:java -Xmx 来扩大内存堆的容量,默认是64MB。在32位体系
结构下理论的最大值是2G,实际上最大在1.2G左右。
你的代码只需要继续 readLine(), 就行了。
如果对文件中记录没太多的业务逻辑判断的话,然后数据库又是oracle的话完全可以用sql loader工具来导入数据。
性能上应该没多大问题。
建议使用数据库支持的批量操作方式。
例如bcp,import,dts等方式。
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);
}
}