Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.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
如何将一个包含1000万条记录的庞大结果集转换为java中的列表?_Java_Resultset - Fatal编程技术网

如何将一个包含1000万条记录的庞大结果集转换为java中的列表?

如何将一个包含1000万条记录的庞大结果集转换为java中的列表?,java,resultset,Java,Resultset,我正在尝试将结果集提取到一个集合中,以便删除重复项并将其放在单独的表中,以简化消毒过程 但是当我尝试使用这个: while (rs.next()) { set.add(new ABC(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5), rs.getString(6), rs.getString(7), rs.getString(8), rs.getStri

我正在尝试将结果集提取到一个集合中,以便删除重复项并将其放在单独的表中,以简化消毒过程

但是当我尝试使用这个:

while (rs.next()) {
    set.add(new ABC(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5),
        rs.getString(6), rs.getString(7), rs.getString(8), rs.getString(9), rs.getString(10),
        rs.getString(11), rs.getString(12), rs.getString(13), rs.getString(14), rs.getString(15),
        rs.getString(16), rs.getString(17), rs.getString(18), rs.getString(19), rs.getString(20),
        rs.getString(21), rs.getString(22), rs.getString(23), rs.getString(24), rs.getString(25),
        rs.getString(26)));
}
在一百万条记录之后,Java抛出了一个系统开销GC错误?
有其他选择吗?

如果您最终想要的结果是一个新表,其数据是原始表减去重复数据,那么这是一个应该在数据库中完全处理的操作,而不是在Java中:

CREATE TABLE newTable (col1 varchar(50), col2 varchar(50), ..., col26 varchar(50));
INSERT INTO newTable (col1, col2, ..., col26)
SELECT DISTINCT col1, col2, ..., col26
FROM originalTable;

如果您只能将所有数据加载到内存中,并且从数据库中提取的字符串中存在一些冗余,那么字符串插入可能会有所帮助

使用实用程序方法正确处理null,然后用它包装所有getString调用

while (rs.next()) {
    set.add(new ABC(intern(rs.getString(1)), intern(rs.getString(2)), 
intern(rs.getString(3)), intern(rs.getString(4)), intern(rs.getString(5)),
        intern(rs.getString(6)), intern(rs.getString(7)), intern(rs.getString(8)), 
intern(rs.getString(9)), intern(rs.getString(10)),
        intern(rs.getString(11)), intern(rs.getString(12)), intern(rs.getString(13)), 
intern(rs.getString(14)), intern(rs.getString(15)),
        intern(rs.getString(16)), intern(rs.getString(17)), intern(rs.getString(18)), 
intern(rs.getString(19)), intern(rs.getString(20)),
        intern(rs.getString(21)), intern(rs.getString(22)), intern(rs.getString(23)), 
intern(rs.getString(24)), intern(rs.getString(25)),
        intern(rs.getString(26))));
}       

private String intern(String string) {
         return string == null ? null : string.intern();
}

在Java 9或更高版本上运行也会有所帮助,因为这些版本的字符串平均使用更少的内存。

为什么?你期待什么?为什么不逐行处理您已经拥有的结果集呢?您最好利用数据库来实现这一点。只需找到一个查询或存储过程,它可以找到重复的数据,而无需将所有数据加载到内存中。一些简单的算法:您有1000万行。每行有26个字符串。假设它们都很小,只消耗25字节。让我们忽略集合项使用的内存。所有这些都将消耗10000000 x 25 x 26字节=6.5 GB的内存。你可能没有那么多的记忆力。而字符串可能会消耗更多的能量。集合和ABC实例也会增加内存。一般来说,您不应该试图在内存中处理整个结果集。您不能依赖于将其全部安装到内存中,并且当您可以在服务器端进行处理时,通过网络传输它是浪费的。SQL已经为您提供了过滤器、分组、组总数等各种功能。使用它们。与它有更多的关系,而不是什么?与此无关。根据您的描述,没有必要用Java来实现。