今天创建了一个表用于存放论文数据, 可没想到csv数据就有2GB大小.
于是就有一系列问题需要解决.
- MySQL导入csv文件.
load data local infile '/media/yida//aminder/data/papers.csv' into table paper
FIELDS
TERMINATED BY '|'
ENCLOSED BY '"'
ESCAPED BY ''
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(id,title,abstract,authors,journal);
以上是向paper
表,传入papers.csv
文件.
- Terminated by ‘|’ 表示列分隔符, 用|分隔从而区分正文.
- enclosed by 表示输入mysql的时候, 值将被"包围
- escaped by 表示转义
- ignore 1 lines 表示忽略第一行(因为第一行是文件头)
- 处理csv文件的不合规
- 双引号
文件存在双引号单引号并存, 这就导致在录入的时候, 在某些值处遇到错误的双引号而使数据录入不全.
MySQL Load data infile — double quotes in a double quoted value as “a ”double“ quoted value”
https://stackoverflow.com/questions/43229357/mysql-load-data-infile-double-quotes-in-a-double-quoted-value-as-a-double/43229853
The CSV is broken. There is no way MySQL or any program can import it. The double quotes needed to be escaped if inside a column.
You might fix the CSV with a script. If the quotes doesn’t have a comma in front or behind it, it’s probably part of the text and should be escaped.
解决方法是在文件中将双引号全部替换掉
replace('"', '\'')
- 分隔符
原本以为|
已经够用了, 但是论文中的数据比较复杂, 会出现某些数学式子, 例如条件概率P(X|Y)
.
解决方法是用更加复杂的分隔符, 比如{|}
- 修改大文件上传限制
phpmyadmin限制只能2MB, 大一点就需要用mysql的命令行输入. 然而这还是可能遇到瓶颈. 所以需要将下面两个参数设置大一点.
set global net_buffer_length=1000000; --Set network buffer length to a large byte number
set global max_allowed_packet=1000000000; --Set maximum allowed packet size to a large byte number
其中还以为是sql文件太大, 探索了一下怎么分块文件.
文件分片上传了. Linux自带
split
工具
split -l 500000 papers.csv paper_
- 每个分块文件50w行
- 分块后的文件前缀是
paper_
, 后缀是aa
,ab
,ac
以此类推