我正在尝试解决以下技术问题。我有几个 csv 文件,每个文件包含 400 万到 1100 万行。我需要阅读它们,形成对象,处理并写入数据库)
现在我制作了 mvp,以便逐个文件读取整个文件,形成一个 ArrayList 并将所有内容依次写入数据库
这种方法的问题:
- 极长
- OutOfMemoryException 有跌倒的风险
我如何决定:
- 接下来继续阅读。仅在前一个工作完成后归档
- 将 ArrayList 拆分为 10k 块(如何做得更好?)
- 创建一定数量的线程(Worker 模型)并在它们被释放时为它们提供这些 10k 元素以写入数据库。因此,每个线程都有自己的从 ThreadPool 到数据库的连接。
问题:解决方案中是否有明显的侧柱?如何将 ArrayList 拆分为块?对于这样的任务,默认创建多少个线程是安全的,5-10?
工作中我使用spring4、java8、oracle11g、was8.5.5.13
没有人会马上给你写一份食谱——毕竟,我们谈论的是微调,这里的每一个细节都很重要。粗略地说,我会测量 3 个主要结构元素的速度:
很有可能,我预计大部分时间都花在了读写上(磁盘操作通常总是很长)。
这就是想法本身出现的地方:在一个流中读取并在另一个流中写入。粗略的轮廓是:
基本上,这就是生产者-消费者模式。
这个模式有很多实现,从重的JMS到更轻量的lib,你可以基于BlockingQueue自己写