V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zxdhuge
V2EX  ›  数据库

JAVA 读取大文件导入数据库

  •  
  •   zxdhuge · 2016-09-19 10:47:44 +08:00 · 1330 次点击
    这是一个创建于 2776 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    另外性能调优不要看感觉。 CPU ,内存, IO 这些都有工具可以测量他们的实际负载情况 (top, vmstat, iostat)。
    otakustay
        12
    otakustay  
       2016-09-19 13:01:11 +08:00
    要不试试把外键删了能快多少?
    romisanic
        13
    romisanic  
       2016-09-19 13:20:25 +08:00
    怎么感觉都不像是到了 io 的瓶颈啊
    确定程序没有优化空间了?
    ytmsdy
        14
    ytmsdy  
       2016-09-22 15:55:00 +08:00
    如果够豪,数据库服务器上 ssd ,多快好省。
    如果闲工夫比较多,那么试试看把外键去掉,然后再试试看。看看 cpu 数据在导入的时候的使用率,看看内存看是不是一次性把数据加载到内存里面了。最后再看看 IO,其实我觉得 IO 问题是最好解决的,直接上 ssd 就好了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1889 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 16:32 · PVG 00:32 · LAX 09:32 · JFK 12:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.