JAVA 读取 6 个文件,一共 16w 行,插入 oracle 数据库,不用考虑重复,每条记录有两个字段是外键。 现在起了 6 个线程读 6 个文件分别处理,耗时 7 秒左右。 感觉瓶颈在磁盘 io ,多线程也没啥效果,请问还有什么优化方案?
1
wuhang89 2016-09-19 10:50:48 +08:00
你怎么优化算法都没有 raid0 外加固态硬盘效果明显,建议更换硬件。
|
2
tjxjj 2016-09-19 10:55:14 +08:00
干嘛用 java...sqlload 啊
|
3
husky 2016-09-19 10:57:16 +08:00
文件大吗?试试放到 /dev/shm 下
|
4
clino 2016-09-19 11:00:29 +08:00
确定瓶颈在磁盘 IO? 是说读文件慢还是写到数据库慢?
|
5
zxdhuge OP |
6
skydiver 2016-09-19 11:25:20 +08:00
多线程比单线程还慢是正常的……
|
7
skydiver 2016-09-19 11:25:42 +08:00
并发插入还不如顺序插入快
|
8
skydiver 2016-09-19 11:26:34 +08:00
而且一共就几秒,优化个啥劲儿……要是耗时几小时还值得优化……
|
10
yidinghe 2016-09-19 12:18:39 +08:00 via Android
每行 1KB 算一共 100 多 M , 7 秒读取完毕算是到了 IO 瓶颈了吧。
|
11
sylecn 2016-09-19 12:53:13 +08:00
@skydiver 就是就是。除非你还有很多个这样的文件,或者你是闲得慌的 DBA ,不然秒级别的导入根本不需要优化。
同意上面多线程可能更慢的说法。 另外性能调优不要看感觉。 CPU ,内存, IO 这些都有工具可以测量他们的实际负载情况 (top, vmstat, iostat)。 |
12
otakustay 2016-09-19 13:01:11 +08:00
要不试试把外键删了能快多少?
|
13
romisanic 2016-09-19 13:20:25 +08:00
怎么感觉都不像是到了 io 的瓶颈啊
确定程序没有优化空间了? |
14
ytmsdy 2016-09-22 15:55:00 +08:00
如果够豪,数据库服务器上 ssd ,多快好省。
如果闲工夫比较多,那么试试看把外键去掉,然后再试试看。看看 cpu 数据在导入的时候的使用率,看看内存看是不是一次性把数据加载到内存里面了。最后再看看 IO,其实我觉得 IO 问题是最好解决的,直接上 ssd 就好了 |