通过ftp采集文件数据的性能总结
1,简介
在数据采集的过程中,使用excel或csv的格式将数据上传到服务器上,再通过Java的文件操作和流操作,获取上传文件的信息,最后通过CSVReader读取上传的文件信息,最后通过jdbc接口将文件信息存储到数据库中。
本篇文章主要研究在使用java的各种开源框架采集ftp上传的数据时,如何可以快速的上传数据,同时保证比较少的系统资源的消耗。
2,性能测试
性能测试是在优化jdbc接口之后,使用大批量数据测试扫描存储文件的性能。测试时单次存储5条数据。使用的是批量接口。
系统配置如下:
应用服务器:
1, cpu inteli3
2, 内存 8G
数据库服务器:
1,cpu Intel(R)Xeon(R) CPU
2,内存 4G
3, 使用的是mysql数据库
进行批量测试的性能指标如下:
插入条数 | 使用时间(ms) | 服务器内存消耗 | 数据库服务器内存消耗 | 碰到问题 |
100 | 833 | 35.5M | 15.7% |
|
1000 | 3971 | 54.5M | 15.7% |
|
10000 | 13399 | 111.5M | 15.7% |
|
20000 | 19639 | 154M | 15.7% |
|
30000 | 27308 | 188M | 14.7% |
|
100000 | 90039 (1.5min) | 453M | 15.7% |
|
200000 | 204598(3.4min) | 847M | 15.7% |
|
300000 | 295438(4.9min) | 1014M | 15.7% |
|
400000 | 1093927(18.2min) | 1292M | 15.7% |
|
500000 | 1570964(26.2min) | 1433M | 15.7% |
|
600000 | 1668328(27.8min) | 1780M | 15.7% |
|
700000 | 2372982(39.5min) | 1855M | 15.7% |
|
800000 | 2865081(47.8min) | 2015M | 15.7% |
|
900000 | 3584745(59.7min) | 2129M | 15.7% | 单笔90万条消耗时间比较长 |
1000000 |
| 2095M |
| java.lang.OutOfMemoryError: GC overhead limit exceeded |
3,优化方案1
将数组获取到的数据,在插入数据库时,单次批量插入10000。测试结果如下。
使用时间(ms) | 服务器内存消耗 | 数据库服务器内存消耗 | 碰到问题 | |
100 | 833 | 35.5M | 15.7% |
|
1000 | 3971 | 54.5M | 15.7% |
|
10000 | 13399 | 111.5M | 15.7% |
|
20000 | 22684 | 157M | 15.7% |
|
30000 | 30716 | 208M | 15.7% |
|
100000 | 95958(1.5min) | 463M | 15.7% |
|
200000 | 180388 (3.0min) | 384M | 15.7% |
|
300000 | 275388 (4.5min) | 420M | 15.7% |
|
400000 | 377242 (6.28min) | 505M | 15.7% |
|
500000 | 527830(8.8min) | 552M | 15.7% |
|
600000 | 588103(9.8min) | 726M | 15.7% |
|
700000 | 723151(12.1min) | 880M | 15.7% |
|
800000 | 901322(15.0min) | 850M | 15.7% |
|
900000 | 1113462(18.6min) | 928M | 15.7% |
|
1325419(22.0min) | 806M | 15.7% |
| |
1500000 | 2179144(36.3min) | 1097M | 15.7% |
|
2000000 | 3569986(59.5min) | 1562M | 15.7% |
|
3000000 |
|
|
|
|
4,优化方案2
采用Java流机制,在插入数据库时,单次批量插入10000。测试结果如下。
插入条数 | 使用时间(ms) | 服务器内存消耗 | 数据库服务器内存消耗 | 碰到问题 |
100 | 273 | 40.4M | 15.8% |
|
1000 | 1236 | 51.4M | 15.8% |
|
10000 | 9645 | 91.5M | 15.8% |
|
20000 | 21685 | 134M | 15.8% |
|
30000 | 27509 | 201M | 15.8% |
|
100000 | 89067(1.5min) | 198M | 15.8% |
|
200000 | 175856(2.9min) | 186M | 15.8% |
|
300000 | 265390(4.4min) | 196M | 15.8% |
|
400000 | 356549(5.9min) | 202M | 15.8% |
|
500000 | 453659(7.6min) | 202M | 15.8% |
|
600000 | 576562(9.6min) | 199M | 15.8% |
|
700000 | 730090(12.2min) | 200M | 15.8% |
|
800000 | 769520(12.8min) | 200M | 15.8% |
|
900000 | 1124001(18.7min) | 209M | 15.8% |
|
1000000 | 1341186(22.4min) | 202M | 15.8% |
|
1500000 | 2566401(42.8min) | 204M | 15.8% |
|
2000000 |
|
|
|
|
5,优化方案3
减少创建对象,优化程序。测试结果如下。
插入条数 | 使用时间(ms) | 服务器内存消耗 | 数据库服务器内存消耗 | 碰到问题 |
10000 | 10022 | 99.6M | 15.8% |
|
100000 | 88925(1.5min) | 203M | 15.8% |
|
500000 | 444200(7.4min) | 201M | 15.8% |
|
1000000 | 1327358(22.1min) | 202M | 15.8% |
|
1500000 | 2588956(43.1min) | 202M | 15.8% |
|
2000000 |
|
|
|
|
6,总结
通过ftp机制采集数据,在数据量比较大的情况下,有两条优化思路,一条是使用批量插入时控制好批量插入单次的条数。第二条是最好使用底层的机制,开源软件有时在设计时考虑的东西太多,会增加系统的资源消耗。