【发布时间】:2019-02-12 19:10:23
【问题描述】:
ListIterator it= FileUtils.lineIterator(bigFile);
List<String> rows = new ArrayList<String>();
//Iterate and add lines to list
while(it.hasNext){
rows.add(it.next())// Exception1
}
//ExecutorService to Iterate a chunk of 20K rows
// In Executor create do validations and create pojo List
// exeutor service to iterate Pojo list and save 20k chunk pojo in mongo db
问题/异常:.
1. 无法创建名为rows的列表,出现OutOfMemory堆异常。
2.如果我不创建列表并处理每一行并存储在mongo中。这将花费大量时间,并且还可能导致其他异常。
读取和处理如此大的文件的最佳方法是什么?
【问题讨论】:
-
你必须批量处理大文件。读取一批(即 20k 行),将每一行转换为 POJO,将每个 POJO 存储在最多 20k 个元素的临时列表中,然后将列表存储在 MongoDB 中(Mongo 有 saveAll 或类似方法)。按顺序进行。然后,只有当您对性能不满意时,我们才可能开始讨论并行处理。
-
如何读取一行,添加到阻塞队列。会有多个消费者线程。这些消费者将获取 5K 的数据块并创建 pojo 并存储在 mongo Db 中。如果有更好的方法,请告诉我
-
@Federico Peralta Schaffner 您建议的方式是最好的。我尝试使用生产者和多个消费者创建阻塞队列。即使这需要相同的时间,即 7 分钟存储到 mongo。但是发送到 kafka 大约需要 35 分钟。有什么可以做的吗
-
我无法从这个问题中看出什么,也没有真正在实际项目中工作,对不起。
-
@Federico Peralta Schaffner 没问题..谢谢
标签: java mongodb collections filereader