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

PHP 50W 条记录 EXCEL 文件导入数据库求指导下方法

  •  
  •   jd186 · 2018-04-11 10:33:58 +08:00 · 5587 次点击
    这是一个创建于 2421 天前的主题,其中的信息可能已经有所发展或是发生改变。

    数据库表有 50W 左右的记录。每条记录有 300 的个的字段。

    要以 EXCEL 或者 CSV 形式的文件批量导入数据库。

    我用 PHPEXCEL 做导入时一直报错。文件都打不开。求大神指导下。谢谢

    37 条回复    2018-04-19 16:51:07 +08:00
    greed1is9good
        1
    greed1is9good  
       2018-04-11 10:39:00 +08:00 via Android
    每条记录 300 个字段。。。。
    服。。。
    vincenttone
        2
    vincenttone  
       2018-04-11 10:39:57 +08:00
    保存成 csv,然后 php 或者 shell 直接读文件,按行读取,别一口气载入内存,读取几百条就往数据库塞一次,没塞进去的记录一下。
    jd186
        3
    jd186  
    OP
       2018-04-11 10:40:10 +08:00
    @greed1is9good 确实是这样是一个汽车配件关联表。他 300 多个字段全是配件关联 ID。很奇葩
    lbp0200
        4
    lbp0200  
       2018-04-11 10:40:52 +08:00
    你为什么不说 PHP 爆出的错误信息?
    b821025551b
        5
    b821025551b  
       2018-04-11 10:42:36 +08:00
    用 csv 然后按行读文件吧,PHPEXCEL 一下子导入那么多会爆炸的。
    yogogo
        6
    yogogo  
       2018-04-11 11:04:14 +08:00
    yield 了解下
    YMB
        7
    YMB  
       2018-04-11 11:08:10 +08:00
    建议解决方案:
    1.看看有没有支持将 Excel 转换为 sql 语句的工具。
    2.看看有没有支持将 Excel 导入到数据库的工具,不知道 navigate 是否支持。
    3.看看有没有工具能分割 Excel,多跑几次。
    4.PHP 语言本身没问题,看咋用。
    jimmyczm
        8
    jimmyczm  
       2018-04-11 11:09:58 +08:00   ❤️ 1
    之前我是用 access 将数据库里面的导出来,再转成相应的文件
    cdwyd
        9
    cdwyd  
       2018-04-11 11:12:48 +08:00 via Android
    必须用 php 吗?
    不是的话用 load from 这个数据量很容易
    sarices
        10
    sarices  
       2018-04-11 11:19:42 +08:00
    navicat
    lsls931011
        11
    lsls931011  
       2018-04-11 11:20:06 +08:00   ❤️ 1
    使用 PHP 每一次读取几百条记录然后放入 redis 的队列里面, 再使用另外一个 PHP 进程读取 redis 并放入数据库。 如果怕内存暴涨, 可以判断队列长度,等待队列的数据被读取完了, 再放入队列里面,继续工作. 50W 数据你直接使用 PHPExcel 然后 foreach 去读取,php 可能会因为耗时太久报错了
    houshengzi
        12
    houshengzi  
       2018-04-11 11:21:32 +08:00
    生成器,了解一下
    gouchaoer
        13
    gouchaoer  
       2018-04-11 11:31:31 +08:00
    用 csv 一次读取一部分数据,然后导入数据库
    mylopk
        14
    mylopk  
       2018-04-11 11:32:57 +08:00
    mysql load data file,整个文件导入,一条 sql 语句解决
    mosliu
        15
    mosliu  
       2018-04-11 11:39:41 +08:00
    不熟悉 php
    不过感觉可以用工具来做啊
    用 navicat 这个应该没问题。。。
    Mac
        16
    Mac  
       2018-04-11 12:02:17 +08:00
    @b821025551b 没那么恐怖,我 I3 的机器,8G 内存,用 PHPEXCEL 导 5W 条记录,几乎是秒倒的
    tomczhen
        17
    tomczhen  
       2018-04-11 12:02:48 +08:00 via Android
    上传文件,把 CSV / excel 当数据库来操作。
    akira
        18
    akira  
       2018-04-11 12:22:18 +08:00
    @Mac 加载都不能秒加载吧,何况是导入到库里面。

    @jd186 本地想办法把 excel 文件转化成 csv 格式或者处理成 sql,再来做到数据库的导入动作。不要拿着个 php 就到处敲
    lianxiaoyi
        19
    lianxiaoyi  
       2018-04-11 12:27:47 +08:00
    50 万数据量并不大啊。。。。。就内存稍微大点吧 。加根内存条解决啊。。。。云服务器暂时买一台内存比较大的服务器就好了啊。。。然后用 cli 模式导入。。。。
    Mac
        20
    Mac  
       2018-04-11 12:38:34 +08:00
    @akira 可能是我的列数没他这么夸张,我大概是 10 列。excel 文件里有很多暗桩的,有些\n \r 你导出成 csv 还是有,我就吃过这个暗亏,groupby 出来看上去是相同的,其实是不同的。还是用 php 过滤处理一下比较干净。
    moro
        21
    moro  
       2018-04-11 12:47:33 +08:00
    用 Navicat,可以直接导入 excel
    heretreeli
        22
    heretreeli  
       2018-04-11 12:50:20 +08:00
    Navicat +1
    fortunezhang
        23
    fortunezhang  
       2018-04-11 16:16:44 +08:00
    我一般是用 python 读取 excel 文件,然后一次读取一条,组织成 sql,写入一个 sql 文件中,然后 mysql source 一下。
    Bisn
        24
    Bisn  
       2018-04-11 16:45:07 +08:00
    Perl
    yujieyu7
        25
    yujieyu7  
       2018-04-11 16:55:41 +08:00
    估计是一次性读取入内存做写入的,这个数据量,一个字段 10 字节,都 50w*300*10B,小 1.4g 。

    自己写个脚本,一行行的读取导入吧
    wingoo
        26
    wingoo  
       2018-04-11 16:59:57 +08:00
    load data 最快的
    xiaoyang7545
        27
    xiaoyang7545  
       2018-04-11 17:09:44 +08:00
    直接 navicat 可以的话就 navicat,如果实在需要 php。请分段用 csv。用 xls 的格式+phpexcel 效率非常低下。你这个估计是超出内存限制了。
    tegic
        28
    tegic  
       2018-04-11 17:12:25 +08:00
    lihongjie0209
        29
    lihongjie0209  
       2018-04-11 17:52:22 +08:00
    forkjoin thread pool 了解一下.
    本质上也是切割文件然后多线程插入数据库.
    silencefent
        30
    silencefent  
       2018-04-11 18:00:41 +08:00
    干嘛不用工具呢,mysqlfront 十分钟之内搞掂
    liujinsong668
        31
    liujinsong668  
       2018-04-11 20:35:50 +08:00
    生成器,了解下
    wwww961h
        32
    wwww961h  
       2018-04-11 22:22:18 +08:00
    用工具吧,最简单了,navicat
    ericgui
        33
    ericgui  
       2018-04-12 05:41:44 +08:00
    DavidNineRoc
        34
    DavidNineRoc  
       2018-04-12 07:35:09 +08:00 via Android
    使用 excl 转化成 csv,现在很多数据库可以直接把 csv 转成表,变成表之后再做字段的修改之类的
    dy7338
        35
    dy7338  
       2018-04-16 18:00:37 +08:00
    数据库可以直接导入 excel 格式的
    jourdon
        36
    jourdon  
       2018-04-19 16:48:18 +08:00
    300 个字段还放一个表里,历害了。。。
    jourdon
        37
    jourdon  
       2018-04-19 16:51:07 +08:00
    用 SplFileObject 来读取吧,几万条写一次,速度很快,我试过 50 万条数据 不到一分钟搞定
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5162 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 01:14 · PVG 09:14 · LAX 17:14 · JFK 20:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.