用java读取20gb的文本文件
我有一个20gb的文本文件,我想读取并将数据存储到数据库中。问题是,当我试图在它可以打印出任何内容之前加载它,以查看程序正在执行的操作时,它被终止,这似乎是由于文件的大小。如果有人对如何高效阅读此文件有任何建议,请告诉我。来自另一篇文章 首先,如果您的文件包含二进制数据,那么使用BufferedReader将是一个很大的错误(因为您将数据转换为字符串,这是不必要的,并且很容易损坏数据);您应该改用BufferedInputStream。如果它是文本数据,并且需要沿换行符拆分它,那么使用BufferedReader是可以的(假设文件包含合理长度的行) 关于内存,如果您使用大小适中的缓冲区(我会使用至少1MB的内存来确保HD主要进行顺序读写),应该不会有任何问题 如果速度成了一个问题,你可以看看java.nio包——它们应该比java.io快 至于将其读取到数据库,请确保使用某种批量加载API,否则将花费很长时间 下面是我用于Netezza的批量加载例程的一个示例用java读取20gb的文本文件,java,io,java.util.scanner,Java,Io,Java.util.scanner,我有一个20gb的文本文件,我想读取并将数据存储到数据库中。问题是,当我试图在它可以打印出任何内容之前加载它,以查看程序正在执行的操作时,它被终止,这似乎是由于文件的大小。如果有人对如何高效阅读此文件有任何建议,请告诉我。来自另一篇文章 首先,如果您的文件包含二进制数据,那么使用BufferedReader将是一个很大的错误(因为您将数据转换为字符串,这是不必要的,并且很容易损坏数据);您应该改用BufferedInputStream。如果它是文本数据,并且需要沿换行符拆分它,那么使用Buffe
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();
}
如果需要将信息加载到可以使用的数据库中,
这样,您将读取文件、管理事务、对文件执行流程、将行持久化到数据库中、控制要执行提交的记录数量,我认为这是一个更好的选择,因为第一个问题是读取大文件,但下一个问题是管理数据库的事务,控制提交等。我希望它能帮助您如果您正在阅读非常大的文件,请始终选择InputStreams。 e、 g
如何储存?一团?将其拆分为单独的字段/记录?听起来好像您试图加载整个文件,然后才处理它。在内存中存储20GB不是正确的做法—逐行读取文件并存储它。你可以一次存储几行,但不能存储整个文件。有没有一个类可以将文件分割成更小的块?你有没有关于批量加载api的资源或者之前的问题可以提供帮助?
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = null;
StringBuilder responseData = new StringBuilder();
while((line = in.readLine()) != null) {
// process line
}