虽然我过去曾处理过大型数据集,但从未处理过如此庞大的数据集。这是分割:
- 每个月我都会收到一个 5GB 的平面文件,每行包含 1 条数据库记录
- 此文件包含大约 1000 万行数据,随后的每个月包含的数据都比前一个月多
- 数据可能有需要忽略的完全重复
- 数据也可能存在不精确的重复,需要分析,只插入其中一行,其余丢弃
我需要为 10 年的数据设置初始加载,大约有 15 亿行。我对处理此问题的数据库没有问题,但我无法快速加载此数据。
我目前一次插入一行,允许主键约束让我知道是否有一行需要查看,这些行放在单独的表中。
加载一个 5GB 的文件大约需要 10 个小时,这是我所能达到的最快速度。我将其设置为一次预处理大约 25,000 行,然后我通过一个语句遍历它们,如下所示:
public void saveBatchSql(String[] sql) { try { Statement stmt = dbCon.createStatement(); for (String query : sql) { try { stmt.execute(query); } catch (Exception ee) { query = query.replace("component_detail", "component_detail_duplicate"); stmt.execute(query); } } stmt.close(); } catch (Exception e) { e.printStackTrace(); } }
到目前为止,这是我能想到的最好的。有没有人对如何使它更快地工作有任何想法?据我所知,我无法处理内存中的所有记录,但也许还有其他方法?
顺便说一句,我加载到的数据库是 Sybase 版本 16。
最佳答案
这取决于数据库,但通常推荐的方法是使用数据库工具从 CSV 等简单格式加载数据。根据数据库的不同,您可能需要在导入前删除索引并在导入后重新创建它们。数据库文档通常会提供一些关于如何提高批量数据加载性能的提示。
我建议不要使用 Java 进行批量加载。有什么用?
只是为了加载?数据库工具为此进行了优化,您将无法在 Java 中做得更好。
加载时的数据处理?好吧,通常您可以在数据库中使用 SQL 完成大部分数据处理。因此,将数据加载到传入表中并对其运行 SQL 查询。与 Java 中的硬编码处理逻辑相比,它更加灵活。在大多数情况下,它也会更高效,因为数据库在优化 SQL 查询/语句方面非常聪明。
关于java - 通过 Java 将超大数据集加载到关系数据库的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50308341/