当前位置: 首页 > news >正文

php图片网站源码建设网站门户

php图片网站源码,建设网站门户,哈尔滨做网站seo的,科技公司网站设计欣赏最近有个需求解析一个订单文件#xff0c;并且说明文件可达到千万条数据#xff0c;每条数据大概在20个字段左右#xff0c;每个字段使用逗号分隔#xff0c;需要尽量在半小时内入库。思路1.估算文件大小因为告诉文件有千万条#xff0c;同时每条记录大概在20个字段左右并且说明文件可达到千万条数据每条数据大概在20个字段左右每个字段使用逗号分隔需要尽量在半小时内入库。思路1.估算文件大小因为告诉文件有千万条同时每条记录大概在20个字段左右所以可以大致估算一下整个订单文件的大小方法也很简单使用FileWriter往文件中插入一千万条数据查看文件大小经测试大概在1.5G左右2.如何批量插入由上可知文件比较大一次性读取内存肯定不行方法是每次从当前订单文件中截取一部分数据然后进行批量插入如何批次插入可以使用insert(...)values(...),(...)的方式经测试这种方式效率还是挺高的怎么快速插入 100 条数据用时最短这篇看下。3.数据的完整性截取数据的时候需要注意需要保证数据的完整性每条记录最后都是一个换行符需要根据这个标识保证每次截取都是整条数不要出现半条数据这种情况4.数据库是否支持批次数据因为需要进行批次数据的插入数据库是否支持大量数据写入比如这边使用的mysql可以通过设置max_allowed_packet来保证批次提交的数据量5.中途出错的情况因为是大文件解析如果中途出现错误比如数据刚好插入到900w的时候数据库连接失败这种情况不可能重新来插一遍所有需要记录每次插入数据的位置并且需要保证和批次插入的数据在同一个事务中这样恢复之后可以从记录的位置开始继续插入。实现1.准备数据表这里需要准备两张表分别是订单状态位置信息表订单表CREATE TABLE file_analysis (id bigint(20) NOT NULL AUTO_INCREMENT,file_type varchar(255) NOT NULL COMMENT 文件类型 01:类型102:类型2,file_name varchar(255) NOT NULL COMMENT 文件名称,file_path varchar(255) NOT NULL COMMENT 文件路径,status varchar(255) NOT NULL COMMENT 文件状态 0初始化1成功2失败3处理中,position bigint(20) NOT NULL COMMENT 上一次处理完成的位置,crt_time datetime NOT NULL COMMENT 创建时间,upd_time datetime NOT NULL COMMENT 更新时间,PRIMARY KEY (id)) ENGINEInnoDB AUTO_INCREMENT2 DEFAULT CHARSETutf8CREATE TABLE file_order (id bigint(20) NOT NULL AUTO_INCREMENT,file_id bigint(20) DEFAULT NULL,field1 varchar(255) DEFAULT NULL,field2 varchar(255) DEFAULT NULL,field3 varchar(255) DEFAULT NULL,field4 varchar(255) DEFAULT NULL,field5 varchar(255) DEFAULT NULL,field6 varchar(255) DEFAULT NULL,field7 varchar(255) DEFAULT NULL,field8 varchar(255) DEFAULT NULL,field9 varchar(255) DEFAULT NULL,field10 varchar(255) DEFAULT NULL,field11 varchar(255) DEFAULT NULL,field12 varchar(255) DEFAULT NULL,field13 varchar(255) DEFAULT NULL,field14 varchar(255) DEFAULT NULL,field15 varchar(255) DEFAULT NULL,field16 varchar(255) DEFAULT NULL,field17 varchar(255) DEFAULT NULL,field18 varchar(255) DEFAULT NULL,crt_time datetime NOT NULL COMMENT 创建时间,upd_time datetime NOT NULL COMMENT 更新时间,PRIMARY KEY (id)) ENGINEInnoDB AUTO_INCREMENT10000024 DEFAULT CHARSETutf82.配置数据库包大小mysql show VARIABLES like %max_allowed_packet%;--------------------------------------| Variable_name | Value |--------------------------------------| max_allowed_packet | 1048576 || slave_max_allowed_packet | 1073741824 |--------------------------------------2 rows in setmysql set global max_allowed_packet 1024*1024*10;Query OK, 0 rows affected通过设置max_allowed_packet保证数据库能够接收批次插入的数据包大小不然会出现如下错误Caused by: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (4980577  1048576). You can change this value on the server by setting the max_allowed_packet variable.at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3915)at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2598)at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2778)at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2834)3.准备测试数据public static void main(String[] args) throws IOException {FileWriter out  new FileWriter(new File(D://xxxxxxx//orders.txt));for (int i  0; i out.write(vaule1,vaule2,vaule3,vaule4,vaule5,vaule6,vaule7,vaule8,vaule9,vaule10,vaule11,vaule12,vaule13,vaule14,vaule15,vaule16,vaule17,vaule18);out.write(System.getProperty(line.separator));}out.close();}使用FileWriter遍历往一个文件里插入1000w条数据即可这个速度还是很快的不要忘了在每条数据的后面添加换行符(\n\r)4.截取数据的完整性除了需要设置每次读取文件的大小同时还需要设置一个参数用来每次获取一小部分数据从这小部分数据中获取换行符(\n\r)如果获取不到一直累加直接获取为止这个值设置大小大致同每条数据的大小差不多合适部分实现如下ByteBuffer byteBuffer ByteBuffer.allocate(buffSize); // 申请一个缓存区long endPosition batchFileSize startPosition - buffSize;// 子文件结束位置long startTime, endTime;for (int i  0; i count; i) {startTime System.currentTimeMillis();if (i  1 ! count) {int read inputChannel.read(byteBuffer, endPosition);// 读取数据readW: while (read ! -1) {byteBuffer.flip();// 切换读模式byte[] array  byteBuffer.array();for (int j  0; j byte b  array[j];if (b  10 || b  13) { // 判断\n\rendPosition j;break readW;}}endPosition buffSize;byteBuffer.clear(); // 重置缓存块指针read inputChannel.read(byteBuffer, endPosition);}} else {endPosition fileSize; // 最后一个文件直接指向文件末尾}...省略更多可以查看Github完整代码...}如上代码所示开辟了一个缓冲区根据每行数据大小来定大概在200字节左右然后通过遍历查找换行符(\n\r)找到以后将当前的位置加到之前的结束位置上保证了数据的完整性5.批次插入数据通过insert(...)values(...),(...)的方式批次插入数据部分代码如下// 保存订单和解析位置保证在一个事务中SqlSession session sqlSessionFactory.openSession();try {long startTime System.currentTimeMillis();FielAnalysisMapper fielAnalysisMapper session.getMapper(FielAnalysisMapper.class);FileOrderMapper fileOrderMapper session.getMapper(FileOrderMapper.class);fileOrderMapper.batchInsert(orderList);// 更新上次解析到的位置同时指定更新时间fileAnalysis.setPosition(endPosition  1);fileAnalysis.setStatus(3);fileAnalysis.setUpdTime(new Date());fielAnalysisMapper.updateFileAnalysis(fileAnalysis);session.commit();long endTime System.currentTimeMillis();System.out.println(插入数据花费:  (endTime - startTime)  ms);} catch (Exception e) {session.rollback();} finally {session.close();}...省略更多可以查看Github完整代码...如上代码在一个事务中同时保存批次订单数据和文件解析位置信息batchInsert通过使用mybatis的标签来遍历订单列表生成values数据总结以上展示了部分代码完整的代码可以查看Github地址中的batchInsert模块本地设置每次截取的文件大小为2M。经测试1000w条数据(大小1.5G左右)插入mysql数据库中大概花费时间在20分钟左右当然可以通过设置截取的文件大小花费的时间也会相应的改变。推荐去我的博客觉得不错别忘了点赞转发哦
http://www.zqtcl.cn/news/814416/

相关文章:

  • 购物网站设计的目的html简单登录页面代码
  • 网站导航栏下载网页自助建站
  • 新手建立网站的步骤建设企业网站个人网银
  • 俄罗斯女孩制作论文网站wordpress和hexo
  • 南宁市网站设计wordpress主题安装教程
  • 网站取消备案怎样做国外电子商务网站
  • 学校建设网站费用申请青岛平台公司
  • 平面设计师个人网站怎样登录韵网网站
  • 怎么用eclipse做网站开发推广平台取名字
  • 深圳建网站服务商广东佛山建网站
  • 网站推广公司卓立海创英文网站建设需求
  • 无锡网站营销公司简介最专业网站建设公司首选
  • 中文网站建设小组ios开发者账号申请
  • 月熊志网站福州建网站 做网页
  • 不同的网站有不同的风格宁波设计网站公司
  • 学校网站制作平台电子政务门户网站建设代码
  • 产品推广的网站怎么做网站标题与关键词
  • 青蛙网站建设wordpress修改logo
  • 网站套餐方案引擎搜索对人类记忆的影响
  • 滨州市滨城区建设局网站扎金花网站怎么做
  • 网站开发中视屏怎样编辑到网页上常州建站公司模板
  • 视频涉台互联网网站怎么做1cpu0.5g服务器用来做网站
  • 营销型网站设计官网怎么做网站优化 sit
  • 怎样获得做网站的客户免费企业网站程序上传
  • 新闻排版设计用什么软件网站seo诊断分析
  • 手机网站端域名怎样做解析一诺摄影设计
  • 网站开发行业竞争大吗郑州百度推广代运营公司
  • mvc4做网站五设计一个公司网站多少钱
  • 在什么网站可以做外贸出口劳保鞋北京 代理前置审批 网站备案
  • 邢台建设企业网站房地产宣传推广方案