我有这种格式的文本文件
int | string | string | string |
int | string | string | string |
int | string | string | string |
.
.
.
此文件的大小约为80 MB。我必须阅读此文件,并在进行一些评估后将其添加到数据库中。
我所做的是我读了一行,并根据某些条件将它们添加到数据库中。但是这段代码需要很长时间。我运行这段代码已经超过一天,但还没有结果!
我可以做些什么来加快速度。
我知道应该有一些方法可以立即读取整个文件。
BTW我正在使用mysql
帮帮我们!
这是我的代码
public void fill_names_db() throws Exception{
MySQLAccess dao = new MySQLAccess();
Scanner stringScanner;
BufferedReader in = new BufferedReader(new FileReader("C:\\Users\\havij\\Downloads\\taxdump\\names.dmp"));
String tax_id;
String name_txt;
String unique_name;
String name_class;
Connection connect=null;
connect = dao.newConnection();
while (in.ready()) {
String s = in.readLine();
//System.out.println(s);
stringScanner = new Scanner(s).useDelimiter("\t|\t");
tax_id = stringScanner.next();
stringScanner.next();
name_txt = stringScanner.next();
stringScanner.next();
unique_name = stringScanner.next();
stringScanner.next();
name_class = stringScanner.next();
if(name_class.equals("scientific name"))
dao.insertToDB(connect, "id_to_name", tax_id.toString(), name_txt);
if(dao.hasKey(connect,"name_to_id",name_txt))
if (!unique_name.isEmpty())
dao.insertToDB(connect, "name_to_id",unique_name,tax_id.toString(),name_txt,unique_name, name_class );
else if(!name_txt.isEmpty())
dao.insertToDB(connect, "name_to_id",name_txt,tax_id.toString(),name_txt,unique_name, name_class );
}
dao.close(connect);
in.close();
System.out.println("done");
}
答案 0 :(得分:4)
该文件已经过良好格式化,无法使用MySQL LOAD DATA INFILE指令。您可以在此处阅读:http://dev.mysql.com/doc/refman/4.1/en/load-data.html
你只需要使用'|'作为字段分隔符,\ n作为行分隔符。
不要忘记LOCAL关键字,因为该文件可能位于SQL客户端的文件系统上。
答案 1 :(得分:2)
在这种情况下,您不希望获得Java的开销。您想使用所谓的load data infile
来自post:
mysql> create table t2 (a varchar(20), b varchar(20), c varchar(20));
Query OK, 0 rows affected (0.01 sec)
mysql> load data infile '/tmp/data.csv' into table t2 fields terminated by ','
enclosed by '"' lines terminated by '\n' (a, b, c);
答案 2 :(得分:1)
正如其他人指出的那样,使用加载数据infile可以更轻松地完成任务。如果您坚持在Java中这样做,请尝试使用允许您指定缓冲区大小的BufferedReader
构造函数,例如
// specify 128K buffer, default is 8K
// You can try larger values, it really depends on your disk I/O
BufferedReader in = new BufferedReader(new FileReader("C:\\Users\\havij\\Downloads\\taxdump\\names.dmp"), 128 * 1024);
请注意另一个问题:如果文件包含UTF8字符,则使用FileReader
进行的apparoach可能会损坏您的数据。最好使用InputStreamReader
并指定文件使用的字符集