用java读取20gb文本文件

时间:2015-07-15 21:20:39

标签: java io java.util.scanner

我有一个20gb的文本文件,我想读取并将数据存储到数据库中。问题是当我尝试加载它之前它可以打印任何东西,看看程序正在做什么它终止,似乎可能是由于文件的大小。如果有人对如何有效阅读此文件有任何建议,请告诉我。

3 个答案:

答案 0 :(得分:2)

来自其他帖子Read large files in Java

  

首先,如果你的文件包含二进制数据,那么使用BufferedReader将是一个很大的错误(因为你将数据转换为String,这是不必要的,很容易破坏数据);你应该使用BufferedInputStream。如果它是文本数据并且您需要沿着换行符拆分它,那么使用BufferedReader就可以了(假设文件包含合理长度的行)。

     

关于内存,如果你使用一个体积适中的缓冲区(我使用至少1MB以确保HD主要进行顺序读写),那就不会有任何问题。

     

如果速度证明是一个问题,你可以看看java.nio包 - 那些应该比java.io更快,

至于将其读取到数据库,请确保使用某种批量加载API,否则将需要永远。

以下是我用于Netezza的批量加载例程的示例...

    private static final void executeBulkLoad(
                    Connection connection, 
                    String schema,
                    String tableName,
                    File file,
                    String filename,
                    String encoding) throws SQLException   {

            String filePath = file.getAbsolutePath();
            String logFolderPath = filePath.replace(filename, "");

            String SQLString  = "INSERT INTO " + schema + "." + tableName + "\n";
            SQLString += "SELECT * FROM\n"; 
            SQLString += "EXTERNAL '" + filePath + "'\n";
            SQLString += "USING\n";
            SQLString += "(\n";
            SQLString += "    ENCODING '" + encoding + "'\n";
            SQLString += "    QUOTEDVALUE 'NO'\n";
            SQLString += "    FILLRECORD 'TRUE'\n";
            SQLString += "    NULLVALUE 'NULL'\n";
            SQLString += "    SKIPROWS 1\n";
            SQLString += "    DELIMITER '\\t'\n";
            SQLString += "    LOGDIR '" + logFolderPath + "'\n";
            SQLString += "    REMOTESOURCE 'JDBC'\n";
            SQLString += "    CTRLCHARS 'TRUE'\n";
            SQLString += "    IGNOREZERO 'TRUE'\n";
            SQLString += "    ESCAPECHAR '\\'\n";
            SQLString += ");";

            Statement statement = connection.createStatement();
            statement.execute(SQLString);
            statement.close();
    }       

答案 1 :(得分:0)

如果您需要将信息加载到数据库中,可以使用Spring batch, 有了这个,你将要读取你的文件,管理事务,对文件执行进程,将你的行保存到数据库中,控制你要执行提交的记录数,我认为这是一个更好的选择,因为第一个问题是阅读大文件,但你的下一个问题是管理数据库的事务,控制提交等等。我跳它帮助你

答案 2 :(得分:0)

如果您正在阅读非常大的文件,请始终更喜欢InputStreams。 e.g。

BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = null;

StringBuilder responseData = new StringBuilder();
while((line = in.readLine()) != null) {
// process line
}