数据库表有 50W 左右的记录。每条记录有 300 的个的字段。
要以 EXCEL 或者 CSV 形式的文件批量导入数据库。
我用 PHPEXCEL 做导入时一直报错。文件都打不开。求大神指导下。谢谢
1 greed1is9good 2018-04-11 10:39:00 +08:00 via Android 每条记录 300 个字段。。。。 服。。。 |
2 vincenttone 2018-04-11 10:39:57 +08:00 保存成 csv,然后 php 或者 shell 直接读文件,按行读取,别一口气载入内存,读取几百条就往数据库塞一次,没塞进去的记录一下。 |
![]() | 3 jd186 OP @greed1is9good 确实是这样是一个汽车配件关联表。他 300 多个字段全是配件关联 ID。很奇葩 |
![]() | 4 lbp0200 2018-04-11 10:40:52 +08:00 你为什么不说 PHP 爆出的错误信息? |
![]() | 5 b821025551b 2018-04-11 10:42:36 +08:00 用 csv 然后按行读文件吧,PHPEXCEL 一下子导入那么多会爆炸的。 |
![]() | 6 yogogo 2018-04-11 11:04:14 +08:00 yield 了解下 |
![]() | 7 YMB 2018-04-11 11:08:10 +08:00 建议解决方案: 1.看看有没有支持将 Excel 转换为 sql 语句的工具。 2.看看有没有支持将 Excel 导入到数据库的工具,不知道 navigate 是否支持。 3.看看有没有工具能分割 Excel,多跑几次。 4.PHP 语言本身没问题,看咋用。 |
8 jimmyczm 2018-04-11 11:09:58 +08:00 ![]() 之前我是用 access 将数据库里面的导出来,再转成相应的文件 |
9 cdwyd 2018-04-11 11:12:48 +08:00 via Android 必须用 php 吗? 不是的话用 load from 这个数据量很容易 |
![]() | 10 sarices 2018-04-11 11:19:42 +08:00 navicat |
11 lsls931011 2018-04-11 11:20:06 +08:00 ![]() 使用 PHP 每一次读取几百条记录然后放入 redis 的队列里面, 再使用另外一个 PHP 进程读取 redis 并放入数据库。 如果怕内存暴涨, 可以判断队列长度,等待队列的数据被读取完了, 再放入队列里面,继续工作. 50W 数据你直接使用 PHPExcel 然后 foreach 去读取,php 可能会因为耗时太久报错了 |
![]() | 12 houshengzi 2018-04-11 11:21:32 +08:00 生成器,了解一下 |
![]() | 13 gouchaoer 2018-04-11 11:31:31 +08:00 用 csv 一次读取一部分数据,然后导入数据库 |
14 mylopk 2018-04-11 11:32:57 +08:00 mysql load data file,整个文件导入,一条 sql 语句解决 |
![]() | 15 mosliu 2018-04-11 11:39:41 +08:00 不熟悉 php 不过感觉可以用工具来做啊 用 navicat 这个应该没问题。。。 |
![]() | 16 Mac 2018-04-11 12:02:17 +08:00 @b821025551b 没那么恐怖,我 I3 的机器,8G 内存,用 PHPEXCEL 导 5W 条记录,几乎是秒倒的 |
![]() | 17 tomczhen 2018-04-11 12:02:48 +08:00 via Android 上传文件,把 CSV / excel 当数据库来操作。 |
![]() | 18 akira 2018-04-11 12:22:18 +08:00 |
![]() | 19 lianxiaoyi 2018-04-11 12:27:47 +08:00 50 万数据量并不大啊。。。。。就内存稍微大点吧 。加根内存条解决啊。。。。云服务器暂时买一台内存比较大的服务器就好了啊。。。然后用 cli 模式导入。。。。 |
![]() | 20 Mac 2018-04-11 12:38:34 +08:00 @akira 可能是我的列数没他这么夸张,我大概是 10 列。excel 文件里有很多暗桩的,有些\n \r 你导出成 csv 还是有,我就吃过这个暗亏,groupby 出来看上去是相同的,其实是不同的。还是用 php 过滤处理一下比较干净。 |
![]() | 21 moro 2018-04-11 12:47:33 +08:00 用 Navicat,可以直接导入 excel |
22 heretreeli 2018-04-11 12:50:20 +08:00 Navicat +1 |
![]() | 23 fortunezhang 2018-04-11 16:16:44 +08:00 我一般是用 python 读取 excel 文件,然后一次读取一条,组织成 sql,写入一个 sql 文件中,然后 mysql source 一下。 |
24 Bisn 2018-04-11 16:45:07 +08:00 Perl |
25 yujieyu7 2018-04-11 16:55:41 +08:00 估计是一次性读取入内存做写入的,这个数据量,一个字段 10 字节,都 50w*300*10B,小 1.4g 。 自己写个脚本,一行行的读取导入吧 |
![]() | 26 wingoo 2018-04-11 16:59:57 +08:00 load data 最快的 |
![]() | 27 xiaoyang7545 2018-04-11 17:09:44 +08:00 直接 navicat 可以的话就 navicat,如果实在需要 php。请分段用 csv。用 xls 的格式+phpexcel 效率非常低下。你这个估计是超出内存限制了。 |
28 tegic 2018-04-11 17:12:25 +08:00 |
29 lihongjie0209 2018-04-11 17:52:22 +08:00 forkjoin thread pool 了解一下. 本质上也是切割文件然后多线程插入数据库. |
30 silencefent 2018-04-11 18:00:41 +08:00 干嘛不用工具呢,mysqlfront 十分钟之内搞掂 |
31 liujinsong668 2018-04-11 20:35:50 +08:00 生成器,了解下 |
32 wwww961h 2018-04-11 22:22:18 +08:00 用工具吧,最简单了,navicat |
![]() | 33 ericgui 2018-04-12 05:41:44 +08:00 |
![]() | 34 DavidNineRoc 2018-04-12 07:35:09 +08:00 via Android 使用 excl 转化成 csv,现在很多数据库可以直接把 csv 转成表,变成表之后再做字段的修改之类的 |
![]() | 35 dy7338 2018-04-16 18:00:37 +08:00 数据库可以直接导入 excel 格式的 |
36 jourdon 2018-04-19 16:48:18 +08:00 300 个字段还放一个表里,历害了。。。 |
37 jourdon 2018-04-19 16:51:07 +08:00 用 SplFileObject 来读取吧,几万条写一次,速度很快,我试过 50 万条数据 不到一分钟搞定 |