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