JAVA 读取大文件导入数据库

2016-09-19 10:47:44 +08:00
 zxdhuge

JAVA 读取 6 个文件,一共 16w 行,插入 oracle 数据库,不用考虑重复,每条记录有两个字段是外键。 现在起了 6 个线程读 6 个文件分别处理,耗时 7 秒左右。 感觉瓶颈在磁盘 io ,多线程也没啥效果,请问还有什么优化方案?

1342 次点击
所在节点    数据库
14 条回复
wuhang89
2016-09-19 10:50:48 +08:00
你怎么优化算法都没有 raid0 外加固态硬盘效果明显,建议更换硬件。
tjxjj
2016-09-19 10:55:14 +08:00
干嘛用 java...sqlload 啊
husky
2016-09-19 10:57:16 +08:00
文件大吗?试试放到 /dev/shm 下
clino
2016-09-19 11:00:29 +08:00
确定瓶颈在磁盘 IO? 是说读文件慢还是写到数据库慢?
zxdhuge
2016-09-19 11:07:54 +08:00
@tjxjj 还需要给每条记录加唯一标识,不能直接 load
@husky @clino 我觉得应该是写数据库的时候慢吧。读文件我是一次性全部读到内存,然后 split ,写数据库用了 batch 批处理。
skydiver
2016-09-19 11:25:20 +08:00
多线程比单线程还慢是正常的……
skydiver
2016-09-19 11:25:42 +08:00
并发插入还不如顺序插入快
skydiver
2016-09-19 11:26:34 +08:00
而且一共就几秒,优化个啥劲儿……要是耗时几小时还值得优化……
hcymk2
2016-09-19 12:07:55 +08:00
@zxdhuge
记录的唯一 id , 先加好再导。
oralce 批量导入数据 还是用 sqlldr 快点。
yidinghe
2016-09-19 12:18:39 +08:00
每行 1KB 算一共 100 多 M , 7 秒读取完毕算是到了 IO 瓶颈了吧。
sylecn
2016-09-19 12:53:13 +08:00
@skydiver 就是就是。除非你还有很多个这样的文件,或者你是闲得慌的 DBA ,不然秒级别的导入根本不需要优化。

同意上面多线程可能更慢的说法。

另外性能调优不要看感觉。 CPU ,内存, IO 这些都有工具可以测量他们的实际负载情况 (top, vmstat, iostat)。
otakustay
2016-09-19 13:01:11 +08:00
要不试试把外键删了能快多少?
romisanic
2016-09-19 13:20:25 +08:00
怎么感觉都不像是到了 io 的瓶颈啊
确定程序没有优化空间了?
ytmsdy
2016-09-22 15:55:00 +08:00
如果够豪,数据库服务器上 ssd ,多快好省。
如果闲工夫比较多,那么试试看把外键去掉,然后再试试看。看看 cpu 数据在导入的时候的使用率,看看内存看是不是一次性把数据加载到内存里面了。最后再看看 IO,其实我觉得 IO 问题是最好解决的,直接上 ssd 就好了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/307184

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX