jd186
V2EX  ›  PHP

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

  •  
  •   jd186 · Apr 11, 2018 · 6997 views
    This topic created in 3128 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

    自己写个脚本,一行行的读取导入吧
    wingoo
    wingoo
    Apr 11, 2018
    26
    load data 最快的
    xiaoyang7545
    xiaoyang7545
    Apr 11, 2018
    27
    直接 navicat 可以的话就 navicat,如果实在需要 php。请分段用 csv。用 xls 的格式+phpexcel 效率非常低下。你这个估计是超出内存限制了。
    lihongjie0209
    lihongjie0209
    Apr 11, 2018
    29
    forkjoin thread pool 了解一下.
    本质上也是切割文件然后多线程插入数据库.
    silencefent
    silencefent
    Apr 11, 2018
    30
    干嘛不用工具呢,mysqlfront 十分钟之内搞掂
    liujinsong668
    liujinsong668
    Apr 11, 2018
    31
    生成器,了解下
    wwww961h
    wwww961h
    Apr 11, 2018
    32
    用工具吧,最简单了,navicat
    DavidNineRoc
    DavidNineRoc
    Apr 12, 2018 via Android
    34
    使用 excl 转化成 csv,现在很多数据库可以直接把 csv 转成表,变成表之后再做字段的修改之类的
    dy7338
    dy7338
    Apr 16, 2018
    35
    数据库可以直接导入 excel 格式的
    jourdon
    jourdon
    Apr 19, 2018
    36
    300 个字段还放一个表里,历害了。。。
    jourdon
    jourdon
    Apr 19, 2018
    37
    用 SplFileObject 来读取吧,几万条写一次,速度很快,我试过 50 万条数据 不到一分钟搞定
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5177 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 117ms · UTC 06:40 · PVG 14:40 · LAX 22:40 · JFK 01:40
    ♥ Do have faith in what you're doing.