数据库表有 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 1
之前我是用 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 1
使用 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 万条数据 不到一分钟搞定
|