0

我正在使用 Java 读取一个大文本文件。该文件有 5.000.000 行,每行有 3 列。文件大小为 350 MB。

对于每一行,我阅读它,使用 Maven 上的 Criteria 创建一个对象,然后使用 session.saveOrUpdate(object) 命令将其存储到 Postgresql 数据库中。

在数据库中,我有一个带有序列 ID 和三个属性的表,其中存储了文件的三列。

一开始,进程运行“快”(30 分钟内 35.000 个寄存器),但每次都较慢,完成时间呈指数增长。我怎样才能改进这个过程?

我曾尝试将大文件拆分为几个较小的文件,但速度几乎较慢。

提前谢谢了!

PD:代码

public void process(){

    File archivo = null;

    FileReader fr = null;
    BufferedReader br = null;

    String linea;
    String [] columna;

    try{
        archivo = new File ("/home/josealopez/Escritorio/file.txt");

        fr = new FileReader (archivo);
        br = new BufferedReader(fr);

        while((linea=br.readLine())!=null){
            columna = linea.split(";");
            saveIntoBBDD(columna[0],columna[1],columna[2]);
        }
    }
    catch(Exception e){
            e.printStackTrace();
    }

    finally{
        try{                   
            if( null != fr ){  
                fr.close();
            }     
        }
        catch (Exception e2){
            e2.printStackTrace();
        }
    }
}

@CommitAfter
public void saveIntoBBDD(String lon, String lat, String met){
    Object b = new Object();
    b.setLon(Double.parseDouble(lon));
    b.setLat(Double.parseDouble(lat));
    b.setMeters(Double.parseDouble(met));
    session.saveOrUpdate(b);
}
4

1 回答 1

2

您应该专注于将其作为批量流程运行,而基于行的处理是您的问题。PostgreSQL 有内置的批量文件加载命令,名为COPY,可以处理逗号分隔文件和制表符分隔文件。当然,分隔符、引号字符和许多其他设置都是可自定义的。

请查看有关数据库人口的官方 PostgreSQL 文档以及COPY命令的详细信息。

这个答案中,我提供了一个小例子来说明我如何做类似的事情。

于 2013-05-31T20:08:13.717 回答