如何规定时间内批量插入1000000条数据到数据库中

Azure Cosmos DB 全球数据分发架构与实战调优指南 分布式数据库的核心挑战在于如何在物理距离、一致性与延迟之间取得工程平衡。Cosmos DB 将全球数据分发能力下沉至基础设施层,通过多区域复制、可编程一致性模型(如 Session/Strong/Bounded Staleness)和逻辑分区(Container)抽象,实现毫秒级跨地域读写。其技术价值不仅在于高可用与弹性吞吐,更在于将原本由应用层承担的数据路由、冲突消解、热点分散等复杂逻辑标准化为配置项。典型应用场景包括跨境SaaS订单系统、IoT海量时序写入、AI实时推荐流等对‘全球强一致低延迟’有硬性要 阅读详情

首先模拟1000000条数据到excel中,

后端需要用到一个工具类来获得到解析excel文件

//1、获取Excel文件(只是创建ExcelReader读取器,还没有开始真正的读)
ExcelReader reader = ExcelUtil.getReader("C:/Users/xiaopeng/Desktop/aa.xlsx");

有了解析excel的工具之后 ,我们要思考下,把文件解析成什么样子了呢?

那么我们使用idea看一下就好了

 很显然返回结果是一个List<List<Object>>,有点蒙。别急慢慢分析下

excel中解析出来的肯定会是一个存放student的集合,但是为什么里面还有一个List呢?

这是因为hootel工具帮我们把excel中的每一行数据都解析成为一个list集合了,List<Object>里面每一项放的是每个字段的值。仔细想想,确实,hootel怎么会知道excel中存放的是什么对象啊,他只能保证把数据解析出来。剩下的需要我们程序员想办法把他包装成我们需要的对象集合,并插入数据库。

好的,思路大概清晰了,那么问题来了,怎么才能把List<List<Object>>变成我们需要的对象集合呢?这简单,提前创建好一个Student类集合,然后从每一项List<Object>的值赋给Student集合不就好了吗?

                students = new ArrayList<>(10000);
                 //   2、 在这里控制每次读取多少条数据
                 readList = reader.read(start, end, true);
                 for (List<Object> objects : readList) {
                     students.add(Student.builder()
                             .id(Long.valueOf(objects.get(0).toString()))
                             .name((String) objects.get(1))
                             .age(Integer.valueOf(objects.get(2).toString()))
                             .build());
                 }

好的现在student集合有了,存数据库吧。1000000万呢!直接存慢死了,能不能多开几个线程一块干呢?必须可以。那我们创建个线程池放十个线程。但是一下1000000万还是太多了,分成多几分吧,一次读一万条,这一万条分给五个不同线程去读,应该就快了。

 int start = 1;
             int end = 10000;

             while (end <= 1000000) {
                 //  1、 以下for循环,主要就是将读取到的数据,封装到这里
                 students = new ArrayList<>(10000);
                 //   2、 在这里控制每次读取多少条数据
                 readList = reader.read(start, end, true);
                 for (List<Object> objects : readList) {
                     students.add(Student.builder()
                             .id(Long.valueOf(objects.get(0).toString()))
                             .name((String) objects.get(1))
                             .age(Integer.valueOf(objects.get(2).toString()))
                             .build());
                 }
                 int i = 0;
                 map = new HashMap<>(5);

                 while (true) {
                     List<Student> list = students.stream().skip(i * 2000).limit(2000).parallel().collect(Collectors.toList());
                     if (list.isEmpty()) {
                         break;
                     }
                     map.put(i + 1, list);
                     i++;
                 }

                 CountDownLatch latch = new CountDownLatch(5);

                 for (List<Student> students1 : map.values()) {
                     executor.submit(() -> {
                         mapper.insertBatch(students1);
                         latch.countDown();
                     });
                 }

                 latch.await();
                 //每10000条提交1次
                 sqlSession.commit();
                 students.clear();


                 start += 10000;
                 end += 10000;
             }

但是肯定有小伙伴比较懵:

 map = new HashMap<>(5);

                 while (true) {
                     List<Student> list = students.stream().skip(i * 2000).limit(2000).parallel().collect(Collectors.toList());
                     if (list.isEmpty()) {
                         break;
                     }
                     map.put(i + 1, list);
                     i++;
                 }

                 CountDownLatch latch = new CountDownLatch(5);

                 for (List<Student> students1 : map.values()) {
                     executor.submit(() -> {
                         mapper.insertBatch(students1);
                         latch.countDown();
                     });
                 }

                 latch.await();
                 //每10000条提交1次
                 sqlSession.commit();

这是干啥的?

别急,我给你细细道来。一万条数据分给五个线程的话,一个线程就是2000,怎么保证一个分到2000啊? 

 while (true) {      List<Student>list=students.stream().skip(i*2000).limit(2000).parallel().collect(Collectors.toList());
                     if (list.isEmpty()) {
                         break;
                     }
                     map.put(i + 1, list);
                     i++;
                 }

在看这段代码,是不是明白了?(stream流不会的需要小补一下哈,我就不讲了)。

现在就是线程也分配到了,开始插数据吧。不行,因为这是五个线程呀,你执行一点插一点,这数据库压力有点大呀,这得连接多久。知识点来了:

2. ExecutorType.BATCH:

  • ExecutorType.BATCH会将一批SQL语句集中在一起批量执行,减少了与数据库的交互次数,提高性能。

  • 多条SQL语句会一起提交到数据库执行,可以提升执行效率。

  • 可以通过`sqlSession.flushStatements()`方法手动触发批量执行。

  • 适用于需要执行大量SQL操作的场景,如批量插入、更新或删除多条记录。

综上所述,ExecutorType.SIMPLE适用于常规的单个或少量SQL操作,而ExecutorType.BATCH适用于需要批量执行大量SQL操作的场景,效率更高。选择适当的执行方式可根据业务需求和性能要求进行衡量。

CountDownLatch latch = new CountDownLatch(5);
for (List<Student> students1 : map.values()) {
    executor.submit(() -> {
        mapper.insertBatch(students1);
        latch.countDown();
    });
}

latch.await();
//每10000条提交1次
sqlSession.commit();
students.clear();

现在应该还是懵,insertBatch就insertBatch呗,你这 executor.submit和 latch.countDown();还有

CountDownLatch latch = new CountDownLatch(5);啥意思啊?

问得好,这里每个线程执行完我们还不能直接提交,我们要等五个线程全部完成后,咱们一块提交,这样数据库执行一次就行了,就高效了对吧?完事儿。下面欣赏全部service代码

 /*
  * Copyright (c) 2021, 2023, peng.cn All rights reserved.
  *
  */
 package com.xiaopeng.service;

 import cn.hutool.core.date.StopWatch;
 import cn.hutool.poi.excel.ExcelReader;
 import cn.hutool.poi.excel.ExcelUtil;
 import com.xiaopeng.dao.TestDao;
 import com.xiaopeng.model.Student;
 import org.apache.ibatis.session.ExecutorType;
 import org.apache.ibatis.session.SqlSession;
 import org.apache.ibatis.session.SqlSessionFactory;
 import org.springframework.stereotype.Service;

 import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.stream.Collectors;

 /**
  * <p>Project: spring-excell-test - TestService
  * <p>Powered by xiaopeng On 2023-07-26 15:37:38
  *
  * @author peng [3121843255@qq.com]
  * @version 1.0
  * @since 1.8
  */
 @Service
 public class TestService {

     @Resource
     private SqlSessionFactory sqlSessionFactory;

     public Integer insertBatch() {
         //1、获取Excel文件(只是创建ExcelReader读取器,还没有开始真正的读)
         ExcelReader reader = ExcelUtil.getReader("C:/Users/xiaopeng/Desktop/aa.xlsx");
         //设置读取的excell页
         reader.setSheet("Sheet1");
         //优化sql插入   ExecutorType.BATCH
         SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
         TestDao mapper = sqlSession.getMapper(TestDao.class);

         //存储读取的数据
         List<List<Object>> readList = null;
         List<Student> students = null;
         Map<Integer, List<Student>> map = null;
         ExecutorService executor = Executors.newFixedThreadPool(10);
         try {
             //计时器
             StopWatch stopWatch = new StopWatch();
             stopWatch.start();

             int start = 1;
             int end = 10000;

             while (end <= 1000000) {
                 //  1、 以下for循环,主要就是将读取到的数据,封装到这里
                 students = new ArrayList<>(10000);
                 //   2、 在这里控制每次读取多少条数据
                 readList = reader.read(start, end, true);
                 for (List<Object> objects : readList) {
                     students.add(Student.builder()
                             .id(Long.valueOf(objects.get(0).toString()))
                             .name((String) objects.get(1))
                             .age(Integer.valueOf(objects.get(2).toString()))
                             .build());
                 }
                 int i = 0;
                 map = new HashMap<>(5);

                 while (true) {
                     List<Student> list = students.stream().skip(i * 2000).limit(2000).parallel().collect(Collectors.toList());
                     if (list.isEmpty()) {
                         break;
                     }
                     map.put(i + 1, list);
                     i++;
                 }

                 CountDownLatch latch = new CountDownLatch(5);

                 for (List<Student> students1 : map.values()) {
                     executor.submit(() -> {
                         mapper.insertBatch(students1);
                         latch.countDown();
                     });
                 }

                 latch.await();
                 //每10000条提交1次
                 sqlSession.commit();
                 students.clear();


                 start += 10000;
                 end += 10000;
             }
             //停止计时
             stopWatch.stop();
             System.out.println("总共耗时" + stopWatch.getTotalTimeSeconds());
         } catch (Exception e) {
             sqlSession.rollback();
         } finally {
             sqlSession.close();
             // 关闭线程池
             executor.shutdown();
         }
         return 1;
     }
 }

controller层

 @RestController
 @RequestMapping
 public class TestController {
     @Autowired
     private TestService testService;

     //测试一
     @RequestMapping(value = "/api/test")
     public String helloTest() {
         testService.insertBatch();
         return "ok";
     }
 }

dao

@Mapper
public interface TestDao {

    Integer insert(Student student);

    Integer insertBatch(List<Student> students);

}

mapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.xiaopeng.dao.TestDao">
    <insert id="insert">
        insert into student(id,name,age) values (#{id},#{name},#{age})
    </insert>

    <insert id="insertBatch">
        insert into student(id,name,age) values
        <foreach collection="students" item="student" open="" close="" separator=",">
            (#{student.id},#{student.name},#{student.age})
        </foreach>
    </insert>
</mapper>

最后注意配置文件还要加一个配置来支持insertBatch插入

server.port=8081

logging.level.root=error
logging.level.com.xiaopeng=debug

#数据库配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3308/excel?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC&rewriteBatchedStatements=true
spring.datasource.username=root
spring.datasource.password=root
#连接池配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasouce.initial-size=5     #初始化连接数
spring.datasouce.minIdle=5          #最小连接数
spring.datasouce.maxAxtive=20       #最大连接数
spring.datasouce.maxWait=6000       #最大等待时间



#mybatis配置
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.xiaopeng.model

加粗的就是注意的,其他没啥了。感谢观看!!!

性能测试——插入1万条数据 无 阅读详情

相关推荐

PostgreSQL数据库管理原理与实操:创建、删除、切换的底层机制

数据库是关系型系统的核心逻辑单元,其本质并非文件夹而是具备独立命名空间、权限边界和WAL日志流的服务级容器。PostgreSQL通过OID映射、系统目录隔离与进程上下文切换实现真正的库级隔离,这种设计保障了高并发下的事务一致性与多租户安全。相比MySQL的schema逻辑分组或SQLite的单文件模型,PostgreSQL的database更接近操作系统级沙盒,支撑金融、医疗等强一致性场景。理解创建时的三次WAL原子写入、删除时的阻塞式对象销毁链路、以及\c命令触发的元数据缓存重载与GUC参数生效机制,是避

chuchen7021的博客 379

10000条数据怎么插入比较快

无论用哪种方法,请确保在插入数据之前备份数据库,并进行测试以及验证插入操作的正确性和一致性。

qq_46130027的博客 3201

Qdrant向量数据库实战:本地化部署、混合检索与RAG生产调优

向量数据库是支撑语义搜索、RAG(检索增强生成)和AI应用落地的核心基础设施,其本质是融合向量相似性检索、标量过滤、全文匹配与时间序列能力的新型数据系统。Qdrant凭借轻量架构、本地可部署特性及对HNSW+标量联合查询的深度优化,在性能、可观测性与工程可控性之间取得关键平衡。相比FAISS需手动管理索引、Chroma存在内存泄漏风险、云服务受限于API版本与冷启延迟,Qdrant以RocksDB自研存储、gRPC/REST双协议、热配置更新等设计,真正实现‘开箱即用的企业级向量检索’。本文聚焦真实生产场景

weixin_30505225的博客 447

jdbc批量插入的4种方式【百万条数据插入只需几秒】

解决批量插入【BatchUpdateException】异常,以及4秒插入100W条数据

C3245073527的博客 4万+

每秒批量插入10000条数据到MySQL中,资源消耗(带宽、IOPS)有多少?

🌟我是廖志伟,一名Java开发工程师、Java领域优质创作者、优快云博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作者、产品软文专业写手、技术文章评审老师、问卷调查设计师、个人社区创始人、开源项目贡献者。🌎跑过十五公里、🚀徒步爬过衡山、🔥有过三个月减肥20斤的经历、是个喜欢躺平的狠人。

我是Java程序员廖志伟,感谢朋友们的支持! 1339

深入瑞芯微SDK:手把手解析Uboot、Kernel到Rootfs的镜像生成与烧录

本文深入解析瑞芯微SDK中从Uboot、Kernel到Rootfs的镜像生成与烧录全流程,揭示编译背后的技术细节。通过详细分析SDK架构、镜像生成流水线、分区表定制、Rootfs构建及烧录科学,帮助开发者从会编译进阶到懂原理,掌握系统级开发的关键技术。

weixin_29193359的博客 273

一次性往数据库中插入1万条数据的方法

MySQL优化

weixin_52130337的博客 9985

新手入门机器学习案例(附源代码)

无

guguo666的博客 6656

如何向MYSQL插入大量数据的方法和性能对比

  在操作mysql的时候,为了理解mysql的特性我们往往需要构造出一张承载很大数据量的数据表。那么如何创建出大数据量的表呢?   首先,我们要在自己的脑中先设想出能够满足这个需求的几个实现方案: 通过你所掌握的语言编写脚本实现 在数据库中直接通过脚本实现   第一种方案实现起来比较简单,对我来说php是我的主语言,我用php去实现这个需求的业务逻辑很简单。但是,在实...

294

[软考]系统架构设计师 备考经验分享(一) - 备考计划篇

前言 上周末刚刚结束了软考架构师的考试,自我感觉考的还可以,大概率是过了。 两次参加软考,一次中级嵌入式,一次高级架构师,都是备考不到两个月时间,尤其是架构师这次考试内容和本职工作有不小的差别,并且需要同时备考三个科目,在高强度地备考中感觉是摸索出到了一点软考的技巧与经验。 打算趁还记得,赶紧写几篇文章做下梳理总结,算是给将来自己考系分、高项或者其他考试做个记录,也希望能够帮到正在备考的大家。 先把第一步,个人的备考计划分享给大家。 自身情况分析 首先,请大家一定先明确三个问题,这三个问题会直接影响到你的

_ 6404

Google AdSense收款前必做:W-8BEN税务认证的3个关键选择与1个提交时机小技巧

本文深入解析Google AdSense收款前必须完成的W-8BEN税务认证,重点介绍账号类型选择、特殊税率勾选、美国活动界定等3个关键决策,并分享提交时机的小技巧,帮助站长高效通过审核,确保广告收入顺利到账。

weixin_30443731的博客 677

JDBC核心技术(进阶)

一、 批量插入 1.1批量执行SQL语句 当需要成批插入或者更新记录时,可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率 JDBC的批量处理语句包括下面三个方法: addBatch(String):添加需要批量处理的SQL语句或是参数; executeBatch():执行批量处理语句; clearBatch():清空缓存的数据 1.2高效的批量插入 数据库中提供一个goods表。创建如下: CREATE TABLE goods( id

str125757855的博客 207

vmvare kali如何配置桥接模式进行上网

注意点:虚拟机可以PING通物理机,但是PING不通其他的网站。经过收集资料,得知由于是校园网连接,所以DHCP只能分配一个授权的IP地址给连接的主机,由于KALI是桥接物理机,物理机已经获得了这个授权的IP,所以导致桥接的虚拟机无法上网。所以不是因为配置的有问题,而是网络的安全设置导致了桥接失败。如果你是使用校园网,可以换个网络试试,使用校园网的时候,可能会遇到桥接失败。

猿小白的博客 1409

mysql数据库 auto_increment_MYSQL数据库中的auto_increment

您的位置:首页 - MYSQL - 正文MYSQL数据库中的auto_increment在MySQL中,经常使用 AUTO_INCREMENT对主键建立自增id的行为,MySQL会自行保证主键ID的自增与不重复,使程序不需对ID进行关注。但是在使用时,MySQL对auto_increment对管理的一些特性可能会导致一些问题,所以需要手工对其进行修改。修改AUTO_INCREMENT,MySQL只...

weixin_39603622的博客 1794

24届数字IC设计/验证秋招总结贴——先看这个

为方便快速进行查找该专栏的内容,将所有内容链接均放在此篇博客中整理不易,欢迎订阅~~

qq_42135020的博客 8416

FPGA学习笔记(一)入门背景、软件及时钟约束的概念及程序下载与固化

使用正点原子的PFPGA开拓者V2学习,通过b站上正点原子的手把手教你学FPGA-基于开拓者V2学习。

贾saisai的博客 3280

数据库基础(三)——数据库索引

数据库基础(三)——数据库索引 前言 数据库索引,很多人可能不知道他是什么东西,只是知道这是面试的高频考点(有很多前端工程师面试的时候也问数据库索引,虽然我也不知道是因为啥,大家自己体会吧)。 文章目录数据库基础(三)——数据库索引前言概述索引索引的使用索引原则索引建立总结 概述 MySQL官方对索引的定义为:索引是帮助MySQL高校获取数据的数据结构。索引可以通过提取句子的主干。索引主要包括以下几种: 主键索引(Primary key): 唯一的标识,主键不可重复; 只能有一个字段作为主键(原则上来说

老程的小白博客空间 777

下载和运行GitHub上的代码教程总结

从昨天开始就想着从GitHub上下载一个开源的Vue的实战项目,希望能从中学习更多的Vue的实用内容,结果搞了半天好不容易下载了,不知道怎么弄。然而,今天终于成功了,激动地我赶紧来记录一下。 如何从GitHub上下载自己需要的项目: 1.首先,你要有一个自己的GitHub(https://github.com/)的账号。关于如何注册GitHub的账号以及如何获取你的SSH密钥这个问题,请大家参...

不怕万人阻挡,只怕自己投降 29万+

学习笔记一 常用的sql优化技巧

sql优化学习日记

qq_44490656的博客 619

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

数据库索引的工作原理

最近再看面试的一些知识,看见了一些写的很好的文章,准备把他们转过来,供大家分享。 原文地址:en.wikipedia.org/wiki/Query_… 译问地址:www.ituring.com.cn/article/986 为什么需要索引 数据在磁盘上是以块的形式存储的。为确保对磁盘操作的原子性,访问数据的时候会一并访问所有数据块。磁盘上的这些数据块与链表类似,即它们都包含一个数据段和一个指针,指...

weixin_34241036的博客 120

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

YCSB数据库性能基准测试实战指南:从原理到应用

数据库性能基准测试是评估和比较数据库系统在特定负载下表现的关键技术手段。其核心原理在于通过模拟真实业务请求模式,量化测量系统的吞吐量、延迟和错误率等关键指标。在技术价值层面,基准测试为数据库选型、容量规划和性能调优提供了客观、可复现的数据依据,避免了仅凭经验或厂商宣传进行决策的风险。从应用场景来看,无论是NoSQL数据库、云数据库服务,还是传统关系型数据库,在面对高并发读写、热点数据访问等典型互联网业务场景时,都需要通过科学的基准测试来验证其实际能力。YCSB作为一款开源的数据库性能基准测试框架,通过其模块

412

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

数据库的索引原理

说白了,索引问题就是一个查找问题。   数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。   为表设置索引要付出代价的:一是增加了数据库的存储空间,二是在...

weixin_33962621的博客 97

SQL约束不是语法糖:数据库数据一致性的五大强制机制

SQL约束是关系型数据库保障数据完整性与业务规则落地的核心机制,其本质是数据库层面对数据写入行为的强制校验。PRIMARY KEY确保行级唯一身份标识,FOREIGN KEY维系跨表强一致性关系,UNIQUE实现业务维度唯一性,CHECK执行字段级业务逻辑过滤,NOT NULL定义数据存在底线。这些约束共同构成比应用层更可靠、更不可绕过的数据治理防线,在金融、电商、政务等强一致性场景中直接决定系统可靠性。本文基于SQL Server实战,覆盖约束设计原理、生产陷阱规避及健康度巡检方法,适用于MySQL/Po

weixin_30292843的博客 396

阿里一面:MySQL 单表数据最大不要超过多少行?为什么?

阿里一面:MySQL 单表数据最大不要超过多少行?为什么?

浩浩的博客 4065

数据库主键设计原理与工业级实践指南

主键是关系型数据库中最基础也最核心的约束机制,其本质是通过唯一性与非空性保障数据行的身份确定性。它不仅定义逻辑完整性,更深度影响物理存储结构(如InnoDB聚簇索引)、查询性能(避免回表与文件排序)、分布式ID生成策略及外键关联语义。理解主键即索引、主键即数据组织方式,是优化SQL查询、设计高并发系统和规避典型故障(如1062主键冲突、1366空值插入)的前提。本文结合自增ID、UUIDv7、Snowflake等主流主键类型选型逻辑,剖析复合主键的函数依赖原则,并覆盖建表、演进、监控与排障全生命周期,为工程

dilv4062的博客 504

关系型数据库核心原理与高并发实战优化指南

关系型数据库本质是通过表结构、外键约束和ACID事务建立数据间的强一致性契约,其底层依赖B+树索引、WAL日志、MVCC等机制保障可靠性与性能。技术价值在于以可验证的方式解决数据冗余、并发冲突和故障恢复三大工程难题,在电商订单、金融支付、医疗系统等强一致性场景中不可替代。本文聚焦真实生产环境中的主键设计、索引失效、隐式类型转换、外键锁表等高频痛点,结合MySQL 8.0压测数据与执行计划分析,详解如何让索引真正生效、让事务安全落地、让查询从秒级降至毫秒级。

weixin_30536513的博客 325
上一篇: SpringMVC执行流程
下一篇: SpringBoot项目连接,有Kerberos认证的Kafka
学会用脚编程
博客等级 码龄6年 3万+粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学会用脚编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值