Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用java读取20gb的文本文件_Java_Io_Java.util.scanner - Fatal编程技术网

用java读取20gb的文本文件

用java读取20gb的文本文件,java,io,java.util.scanner,Java,Io,Java.util.scanner,我有一个20gb的文本文件,我想读取并将数据存储到数据库中。问题是,当我试图在它可以打印出任何内容之前加载它,以查看程序正在执行的操作时,它被终止,这似乎是由于文件的大小。如果有人对如何高效阅读此文件有任何建议,请告诉我。来自另一篇文章 首先,如果您的文件包含二进制数据,那么使用BufferedReader将是一个很大的错误(因为您将数据转换为字符串,这是不必要的,并且很容易损坏数据);您应该改用BufferedInputStream。如果它是文本数据,并且需要沿换行符拆分它,那么使用Buffe

我有一个20gb的文本文件,我想读取并将数据存储到数据库中。问题是,当我试图在它可以打印出任何内容之前加载它,以查看程序正在执行的操作时,它被终止,这似乎是由于文件的大小。如果有人对如何高效阅读此文件有任何建议,请告诉我。

来自另一篇文章

首先,如果您的文件包含二进制数据,那么使用BufferedReader将是一个很大的错误(因为您将数据转换为字符串,这是不必要的,并且很容易损坏数据);您应该改用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();
    }       

如果需要将信息加载到可以使用的数据库中,
这样,您将读取文件、管理事务、对文件执行流程、将行持久化到数据库中、控制要执行提交的记录数量,我认为这是一个更好的选择,因为第一个问题是读取大文件,但下一个问题是管理数据库的事务,控制提交等。我希望它能帮助您

如果您正在阅读非常大的文件,请始终选择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
}