公司有个企业精准营销系统项目,需求就是客户导出他们的客户信息数据和交易数据,都是csv文件,交易数据级别是百万级别,甚至达到千万,用我们系统进行分析时,需要导入mysql数据库中,方便统计分析。
开始没有考虑数据量,我们思路是按行解析csv文件,批量导入mysql中,后来测试发现,对于10w行内数据,基本保持在20秒左右时间导入完成。当数据达到100w行时,导入用时是190秒,太慢了。我们换了一个思路,可以利用多线程,充分利用计算机资源。我们根据文件的大小,拆分成多个文件。每个线程来处理一个文件,最大线程是10个。经测试,导入数据库时间明显减少,用下表数据来展示结果:
附:每5000行批处理提交一次,文件按20000行分割成一个文件,如果大于20w行,则平分成10个文件。
电脑配置:intel i5-2.50GHZ 内存8G 64位操作系统
次数\方式 | 单线程执行(单位:毫秒) | 多线程执行(单位:毫秒) | 相差时间(单位:毫秒) |
1 | 922099 | 573437 | 348662 |
2 | 946358 | 586947 | 359411 |
3 | 956893 | 574340 | 382553 |
次数\方式 | 单线程执行(单位:ms) | 多线程执行(单位:ms) |
1 | 183951 | 100737 |
2 | 163927 | 112452 |
3 | 194593 | 106406 |
次数\方式 | 单线程执行(单位:ms) | 多线程执行(单位:ms) |
1 | 49859 | 21700 |
2 | 54694 | 21891 |
3 | 48976 | 21989 |
次数\方式 | 单线程执行(单位:ms) | 多线程执行(单位:ms) |