目录
开始
这篇博客主要记录的是批量读入txt文件并整合的常见方法及其速度比较,然后是解决中文不能写入到MySQL数据库小技巧。这里我首先比较的是readr&dplyr
和data.table
的读取和拼接速度;其次是比较RODBC和RMySQL这两种不同连接方式将数据写入MySQL的速度,顺便比较读取速度;最后再来简单总结一下。
批量读取txt及按行拼接
这里简单粗暴的方法就是写循环,但是不建议这样做,这里小赵给出了使用lapply的方法。读取的函数也不建议使用基础包里面的,小赵推荐有readr::read_tsv
和data.table::fread
。readr
包据说比基础包快10倍及以上,而且较为灵活,可以设置各列的数据类型,更多的说明和用法请去github看看README; fread
据说要比read_csv/tsv
快2.5倍及以上,但是相对来说没有readr那么多的参数设置,适合快速读入规整的data frame。按行拼接dplyr的是bind_rows
,data.table的是rbindlist
。
数据说明:用于测试的是129个较为规整的txt文件,一共是16列,导入内存中总共约是14W行的样子,2M多。由于各文件中列的数据类型不太一样,为了方便后续的拼接所以全部设成字符串类型。
机器环境说明: i5-6200U, 8G RAM DDR4。
从测试的结果的中位数来看,data.table的速度约比readr快25倍的样子,但是fread
的波动相对来说比read_tsv
大很多。我发现一个有意思的现象,fread第一次读取稍微慢一点,到后面会越读越快。
测试图:
写入MySQL数据库
读入内存中的数据集都是UTF-8
编码的,所以我将MySQL数据库的编码也设置成utf-8
的编码,然后我就入坑了。之后,我不管是通过odbc还是DBI的方式写入数据库时都碰到了中文无法写入问题。最后,我通过反复测试发现原来是数据库编码的问题,这里需要将数据库的编码设置成gb18030/gbk
的方式才行。打通接口后,下面来进行写入测试。
R连接数据库有两种常用方法:一种是通过ODBC的方式,通过RODBC包来实现,但是需要自己下载MySQL的odbc驱动然后通过控制面板里面的管理数据源来进行配置;另外一种方式是DBI,通过RMySQL包来实现连通。
根据上面的结果,发现RMySQL的写入速度完爆RODBC的写入速度,所以还是建议使用RMySQL这种连接方式。不过这个可能会暴露你的用户名及密码,当然你可以预先将用户名以及密码设置成变量保存为script然后通过source来调用就可以了。
读取速度测试
测试完写入速度,最后顺便来测试一下读取速度。
测试10次,从均值来看RMySQL比RODBC 快2倍左右,中位数来看,RMySQL比RODBC快5倍以上,但是其最大值比RODBC大4倍的样子,只能说明RMySQL不是很稳定的样子,可能第一次读取慢点,但是后面就会变的很快。
插图解释ODBC的配置问题
总结
总体来看,RMySQL性能要比odbc的接口要好一些,而且不用下载驱动之类的东西,用起来十分的方便,我个人还是推荐这个。
最后忘了填补一个小坑:数据库中的编码为GB18030所以在读入到R中的时候回乱码,你需要这样几行命令:
然后你就不会出现中文乱码的问题了。Good Luck! :blush:
Bruce Zhao
/
/ - views
Published under(CC) BY-NC-SA 3.0 CN.
//评论数
//参与数