我怎样才能从一个大文件中读取并以快速的方式将其插入到java中的数据库中

时间:2013-07-15 19:47:48

标签: java mysql database performance

我有这种格式的文本文件

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");

    }

3 个答案:

答案 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);

security

答案 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并指定文件使用的字符集