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

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

  •  
  •   jd186 · 189 天前 · 2588 次点击
    这是一个创建于 189 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    自己写个脚本,一行行的读取导入吧
        26
    wingoo   189 天前
    load data 最快的
        27
    xiaoyang7545   189 天前
    直接 navicat 可以的话就 navicat,如果实在需要 php。请分段用 csv。用 xls 的格式+phpexcel 效率非常低下。你这个估计是超出内存限制了。
        28
    tegic   189 天前
        29
    lihongjie0209   189 天前
    forkjoin thread pool 了解一下.
    本质上也是切割文件然后多线程插入数据库.
        30
    silencefent   189 天前
    干嘛不用工具呢,mysqlfront 十分钟之内搞掂
        31
    liujinsong668   189 天前
    生成器,了解下
        32
    wwww961h   189 天前
    用工具吧,最简单了,navicat
        34
    DavidNineRoc   189 天前 via Android
    使用 excl 转化成 csv,现在很多数据库可以直接把 csv 转成表,变成表之后再做字段的修改之类的
        35
    dy7338   184 天前
    数据库可以直接导入 excel 格式的
        36
    jourdon   181 天前
    300 个字段还放一个表里,历害了。。。
        37
    jourdon   181 天前
    用 SplFileObject 来读取吧,几万条写一次,速度很快,我试过 50 万条数据 不到一分钟搞定
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1739 人在线   最高记录 3762   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 21ms · UTC 00:19 · PVG 08:19 · LAX 17:19 · JFK 20:19
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1