【发布时间】:2018-10-22 19:35:47
【问题描述】:
虽然我过去曾使用过大型数据集,但从未使用过如此庞大的数据集。这是细分:
- 每个月我都会收到一个 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。
【问题讨论】:
-
您可以尝试批处理语句。顺便说一句:从内存的角度来看,一次预处理 25,000 行可能效率低下。
-
你有没有分析过是否可以对表进行分区,然后将输入数据分块并通过多线程插入?您还可以为每一行添加校验和哈希/键,以快速检查数据是否更改。
-
我认为第一步应该是使用分析器分析正在运行的代码。我敢打赌,瓶颈远非你想象的那样。
-
@markspace 我怀疑分析是否会产生任何重要结果,因为瓶颈不是 Java 代码而是数据库。
-
根本不要使用java。使用 Sybase 的批量加载实用程序。