分表分库实战方案(突出重点)

Entity Framework 6.0 CodeFirst多层架构数据迁移 在多层架构使用Entity Framework 6.0和CodeFirst进行数据迁移。 立即下载

导读

让人高兴的是,我需要为公司业务量正在(或者面临)告诉增长做出方案,技术方面也会面临一些挑战。

让人担忧的是,我们系统真的就需要“分表分库”了吗?“分表分库”如何去实践?

经过对分库分表的熟悉,做个初版的方案总结,从以下几个方面说起:

  1. 实际将会面临的问题

  2. 有哪几种切入方式(垂直和水平的适用面)

  3. 针对开源技术产品,优缺点是什么

  4. 建议和采纳

目的

  • 请求过大

    • 因为单机TPS、Menmory、IO等都是有限的,所以将求取分散到多台服务器上。(用户的请求和执行一个sql查询本质是一样的,都是一个请求资源)
  • 单库过大

    • 单机数据库的处理力、磁盘空间、IO瓶颈都是有限的,所以将一个大库切分成更多更小的库。
  • 单表过大

    • CRUD遇到瓶颈、索引膨胀、查询超时,所以将大表切分成更多更小的表。

拆分问题

  • 跨库关联问题

    在拆分的时候,很多后端程序数据都是通过sql join等关联查询来完成,而拆分之后,数据库可能是粉丝不是在不同实例和不同的主机上,join将非常麻烦,基于架构规范、性能、安全等综合方面考虑,一般禁止join的,那怎么处理呢?首先考虑垂直分库的设计问题,如果可以调整,优先调整,如果无法调整的情况下,将可以根据实际场景来看下常用的解决思路,分析适合的思路并应用。

    • 全局表

      • 所谓全局表,就是有可能系统所有模块都可能会依赖一些表,比较类似我们理解的“数据词典”,为了避免垮库join查询,我们可以将这类表在其他每个数据库中保存一份,同时这类数据通常不会发生改变(甚至几乎不会),所以不用担心“一致性”的问题。
    • 字段冗余

      • 一种典型的反范式设计,比较常用,通常为了避免join查询。(比如:电商中有个这样的业务场景,“订单表”中保存“卖家ID”的同时,将卖家的“name”字段也冗余,这样查询订单详情的时候就不需要再去查询“卖家用户表”)

        字段冗余能带来遍历,是一种“空间换时间”的体现,使用场景有限,比较适合依赖字段少的情况,最复杂的是数据一致性的问题,这点很难保证,可以借助数据库触发器或者在业务层去保证,当然,结合业务一致性的要求(如果卖家更新了Name,订单中是否要更新),根据不同业务要求去做。

  • 数据同步问题

    • A库中的t_user和B库中的t_device有关联的话,可以定时将指定的表做同步,当然,同步本身会对数据库带来一定的影响,需要性能和数据时效性中取一个平衡,这样避免复杂的垮库查询,项目中可以通过ETL(Camel、Scriptella、Apatar等)工具实施。
  • 系统层组装

    • 在系统层面,调用不通模块的组件或者服务,获取倒得数据并进行字段封装,看起来容易,但时间是飞航复杂,尤其数据库设计上存在问题但又无法轻易调整的时候。下面结合伪代码来描述:

      • 简单列查询的情况,要求是(1.查询用户数据,返回结果为List,T中包含UserId, 2.通过UserId进行数据结果组装)

        public List<T> allMessage(){  
         //获取所有用户信息  
         List<message> msg = messageMapper.getUserMessage();  
         //组装用户相关信息(名字、性别等)  
         for (message iterm : msg) {  
         Users user = userMapper.getUserByPrimary(iterm.getUserId);  
         iterm.setUserName(user.getUserName);  //设置姓名  
         iterm.setUserName(user.sex);      //设置性别  
         }  
         return msg;  
            
        }
        

        伪代码如上,先获取信息列表,再循环调用用户服务获取name,拼装结果。

        上述代码一眼就可以看出有效率问题,循环调用服务,可能有循环RPC,循环数据库,不推荐使用,看下改进后的伪代码:

        public List<T> allMessage(){  
         //获取所有用户信息  
         List<message> msg = messageMapper.getUserMessage();  
         List<Long> UserIdList = new List<Long>  
         for (message iterm : msg) {  
         UserIdList.add(iterm.getUserId);  
         }  
         //传入UserId 获取用户信息  
         List<Users> users = userMapper.getUserByUserIds(UserIdList);  
         //组装用户相关信息(名字、性别等)  
         for (message iterm : msg) {  
         iterm.setUserName(users.where(x -> x.UserId ==                                   iterm.getUserId).FirstOrDefault).RealName();  
         }  
         return msg;  
        }
        

        看起来优雅一点,其实就是把循环调用改成一次调用。当然,服务数据库查询中很可能是in查询,效率比上一中方式更高(in查询会全表扫描,存在性能问题,查询优化器基本成本估算的,经过测试,在In语句条件字段有索引的时候,条件较少的情况是会走索引的)

      • 通过上述简单封装,而不存在条件过滤,当遇到比较复杂的关联查询(左表和右表带条件查询等),不能像之前简单的封装,那怎么去做呢,有几种思路如下:

        1. 查出所有消息数据,然后地用用用户服务端拼装数据,再根据字段过滤,最后进行排序和分页返回数据。这种方式能够保证数据的完整性和准确性,但是影响性能,不建议使用。

        2. 查询出过滤条件不符合,userId不符合,在查询的时候使用函数过滤(如Not in,in),得到有效的消息数据,再调用用户进行封装,这种方式更为优雅。推荐使用

  • 跨库事务(分布式事务)问题

    • 业务数据库拆分之后,肯定遇到“分布式事务”问题,以往通过spring注解等配置方式进行实现事务,现在需要花费一定的成本保证一致性。(针对此,进行另一篇方案介绍)
  • 垮库分页

    • 全局视野法

      • 将order by create_time offset x limit y,改成order by create_time where create_time > ${time} limit y,保证每次只返回一页数据
    • 业务折衷法-允许模糊数据

      • 将order by create_time offset X limit Y,改写成order by create_time offset X/N limit Y/N
    • 业务折衷法-禁止跳页查询

      • 每次翻页,将order by create_time offset X limit Y,改写成order by create_time where create_time >$time_max limit Y以保证每次只返回一页数据,性能为常量
    • 二次查询法

      1. 将order by create_time offset X limit Y,改写成order by create_time offset X/N limit Y

      2. 找到最小值time_min

      3. between二次查询,order by create_time between $$time_min and $time_i_max

      4. 设置虚拟time_min,找到time_min在各个分库的offset,从而得到time_min在全局的offset

      5. 得到了time_min在全局的offset,自然得到了全局的offset X limit Y

拆分方式和方法

描述一种数据集的切分方式,是从物理上的切分,分库分表的顺序原则上是先垂直分,再水平分。因为这样更符合我们显示处理问题的方式。

  • 垂直分库

    • 垂直分库在“微服务中”已经非常普及,按照不同的业务模块划分出不同的数据库,而不像早期一样所有的数据表都放在一个数据库中。很多人没有从根本上搞清楚为什么要拆分,也没有掌握拆分的原则和技巧,只是一味的模仿大厂的做法,导致拆分后遇到很多问题(如:跨库join,分布式事务等)
  • 垂直分表

    • 垂直分表日常开发比较常见,就是通过大表拆成小表,拆分的基于关系数据库中的字段(列)进行,同行建立一个扩展表,将不经常用的字段或者长度较大的字段拆分出去放到"扩展表"中,拆分开确实便于开发和维护,同时某种意义上避免了“跨页”的问题,(mysql、mssql底层都是通过"数据页"来存储的,会造成额外的性能开销)
  • 水平分库

    • 水平分库分表更有效的缓解单机和单库的性能瓶颈压力、连接数、硬件资源等
  • 水平分表

    • 水平分表,能够降低单表的数据量,一定程度上可以缓解查询性能瓶颈。针对数据量巨大的单表,按照某种规则(RANGE,HASH取模等)切分到不同的表中,但本质上这些表还保存在同一个库中,所以库级别还是会有 IO 瓶颈。所以,一般不建议采用这种做法。

    • 水平分库分表的规则常用如下:

      1. RANGE

      2. HASH取模

      3. 地理区域:比如按照华东,华南,华北等区分业务,参考七牛云

      4. 时间:按照时间切分,将一个时间段的数据放到另一张表,达到“热冷数据分离”。

开源产品

  • 分表分库技术选型

    1. Hibernate Shards:Hibernate提供,技术有限,不适用

    2. Sharding-jdbc (ShardingSphere):当当开源,ShardingSphere在Sharding-jdbc已进军apache孵化产品,支持读写分离,支持部分sql函数,不提供监控(需要自身通过一些APM系统进行监控比如 SkyWalking,Zipkin 和 Jaeger)

    3. TSharding:蘑菇街开源

    4. Cobar Client:阿里产品,可代理,不支持读写分离,事务不够友好

    5. Vitess:youtube产品,可代理、架构复杂、自身支持监控有简易GUI

    6. Atlas:360产品,代理、不支持分库分表,算法不完善

建议和采纳

  • 我们目前的数据库是否需要进行垂直分库?

    TODO:根据实际业务商议

  • 垂直拆分有没有原则或技巧?

    没有标准或者黄金答案,一般参考系统业务模块进行数据库拆分,比如“用户中心”,对应的可能是“用户数据库”,但是也不一定严格一一对应,有些情况下,数据库拆分粒度可能比系统的粒度更粗,具体设计权衡,根据业务模块进行探讨,实际就是看开发者和架构师的水平了。

  • 上述举例简单,我们后天报表系统中Join过多,分库后怎么关联查询?

    针对复杂关联查询,其实互联网的业务系统中,本应该尽量避免join的,如果有多个join的,要么设计不合理,要么技术选型错误,参考OLAP和OLTP,报表类的系统在传统系统时代都是采用OLAP数据仓库实现,现在更多的借助于离线分析,流式计算等手段,而不该向上描述的那样在业务中直接在业务库中执行大量的Join和统计。

博主博客:https://blog.ituac.com/

.NET Core实现分表分库、读写分离的通用 Repository功能 首先声明这篇文章不是标题党,我说的这个类库是 FreeSql.Repository,它作为扩展库现实了通用仓储层功能,接口规范参考 abp vnext 定义,实现了基础的仓储层(CURD)。 安装 dotnet add package FreeSql.Repository 可用于:.net framework 4.6+、.net core 2.1+ 定义 var fsql = new FreeSql.FreeSqlBuilder() .UseConnectionString(FreeSql.DataType.Sqlite, @Data Source=|DataDirectory|\d 立即下载

相关推荐

Reactor 响应式编程(第一篇:Reactor核心)

响应式:响应式编程: 全异步、消息、事件回调默认还是用当前线程,生成整个流、发布流、流操作.log();//只要不指定线程池,默认发布者用的线程就是订阅者的线程;

moments的博客 1572

.Net框架下EF分表方案

目标 在.net(非.net core)在EF6基础上最容易实现的分表方案; 思路 1.开源库实现EF的分表,如FreeSql库 2.在EFCore实现分表,已有针对EFCore的分表方案,如EFCore.Sharding库+EFCore3.0 实际应用 待补充... ...

u014094704的博客 1321

gesp c++ 五级知识点

gesp c++ 五级知识点

MMD.然大大 2009

shadingjdbc实战分表分库

shadingjdbc实战分表分库

Gblfy_Blog 1348

【AI 编程工具进阶用法】如何在Cursor、Trae等工具中使用Skills

OpenSkills是一个开源项目,用于在Cursor、Trae等AI编程工具中添加可复用、可组合的"能力模块"。安装流程包括:1)全局安装OpenSkills CLI工具;2)选择安装Anthropic官方Skills到项目或全局;3)创建AGENTS.md文件同步Skills;4)在AI工具中调用Skills。此外还介绍了UI/UX Pro Max Skill项目,通过npm安装后可为AI添加设计能力。这些Skills相当于为AI工具安装"高级技能包"

肌肉金轮的博客 3545

从jieba分词到BERT-wwm——中文自然语言处理(NLP)基础分享系列(12)

今天是本系列的最后一期,完整代码呈现Huggingface transformers平台上微调BERT-wwm-ext的过程方法。

weixin_49518391的博客 3763

分库分表实战-Sharding-JDBC

ComplexShardingStrategy支持多分片键,由于多分片键之间的关系复杂,因此并未进行过多的封装,而是直接将分片键值组合以及分片操作符透传至分片算法,完全由应用开发者实现,提供最大的灵活度。由于分片算法和业务实现紧密相关,因此并未提供内置分片算法,而是通过分片策略将各种场景提炼出来,提供更高层级的抽象,并提供接口让应用开发者自行实现分片算法。垂直分表的意义用于:单行的某些字段数据很大,表占用空间很大,在读写时,严重降低性能,此时需要将拆分到另外一张表,且与原表是一对一的关系,这就是垂直分表。

weixin_39682329的博客 862

【APM】在Kubernetes中搭建OpenTelemetry+Loki+Tempo+Grafana链路追踪(实战一,Loki日志中查看链路追踪数据)

这对于那些不能直接控制 JVM 启动参数的应用特别有用,比如通过 JNI (Java Native Interface) 调用 JVM 的应用、脚本中嵌入的 JVM 应用,或者一些服务管理工具自动启动的服务。这为用户提供了一个灵活的架构,可以根据需要选择最适合自己的追踪解决方案,或者根据环境(如开发、测试、生产)的不同配置不同的后端。: OpenTelemetry SDK 提供了丰富的特性,如自动追踪上下文传播、手动追踪跨度的创建与关联、标签和事件的添加等,使得追踪数据更加丰富和有用。

CN_Eden 3241

ShardingJDBC分库分表实战与核心原理-01

ShardingSphere是一款起源于当当网内部的应用框架。2015年在当当网内部诞生,最初就叫ShardingJDBC。2016年的时候,由其中一个主要的开发人员张亮,带入到京东数科,组件团队继续开发。在国内历经了当当网、电信翼支付、京东数 科等多家大型互联网企业的考验,在2017年开始开源。并逐渐由原本只关注于关系 型数据库增强工具的ShardingJDBC升级成为一整套以数据分片为基础的数据生态 圈,更名为ShardingSphere。

YanQiuXiang 963

2024年12月数据月报

2024年12月大数据月报,为您准备了阿里、字节、百度等大厂150多篇实践案例

SmartSi 2654

Coze工作流的代码无法安装第三方模块(依赖)怎么办?(如何解决Coze工作流代码缺少模块(依赖)的问题)

Coze工作流的代码无法安装第三方模块(依赖)怎么办?(如何解决Coze工作流代码缺少模块(依赖)的问题)

XiaoqiangClub的博客 4365

Java后端架构设计:从业务场景到技术选型的面试实战指南

系统架构设计是软件工程中的核心概念,它定义了软件系统的组织结构、组件关系和技术选型原则。架构设计的原理在于通过合理的分层和模块化,实现系统的高可用、高性能和可扩展性。在技术价值层面,优秀的架构能够降低系统复杂度、提升开发效率、保障业务稳定性。特别是在高并发场景下,缓存架构和数据库分库分表等技术方案能够有效解决性能瓶颈问题。以Redis缓存为例,通过布隆过滤器防止缓存穿透、设置差异化过期时间避免缓存雪崩,这些实践在电商、金融等高频查询场景中具有重要应用价值。本文基于实际面试经验,深入解析如何从业务需求出发,进

weixin_33743703的博客 328

定位精度再突破!Inner-MPDIoU让YOLOv11边界框回归更精准

Inner-MPDIoU 凭借辅助边框与最小点距离的双机制创新,彻底解决了传统 IoU 损失在边界框回归上的精度瓶颈。本教程从原理到代码实现,再到工业场景适配,完整呈现了其在 YOLOv11 中的集成路径。只需简单修改两处核心脚本,你的目标检测模型就能在边界框定位精度上实现跨越式提升——无论是学术研究中的指标突破,还是工业场景下的精细检测需求,Inner-MPDIoU 都能成为你攻克边界框回归难题的利器。现在就动手尝试,让你的检测模型在定位精度上再上一个台阶吧。

FJN110的博客 158

Java程序员面试全攻略:核心注意事项与实战技巧

在竞争激烈的IT行业,Java程序员面试既是技术实力的较量,也是综合能力的全面展示。本文将从技术准备到临场发挥,系统梳理Java程序员面试的完整攻略。

qq479850581的博客 631

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

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

Java程序员找工作的五个重要环节!

精通/掌握/熟悉 Spring Cloud Netflix(Eureka,Config,HttpClient,Ribbon,Hystrix,Zuul)、Spring Cloud Alibaba(Feign,RestTemplate,Gateway,Nacos,Sentinel,Seata),对分布式微服务特点、旧服务改造、服务划分、服务分层和服务治理有深入理解,有线上项目经验。如果毕设项目不怎么样,那就去网上找个项目,然后自己看看业务流程,看看项目用到了哪些技术,自己学一下,再写到简历上去。

田维常 231

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

与阿里高级技术专家的面聊

先列大纲,后续逐个写文章解析见解1.项目经历具体干啥待完善2.七星阵用户体验差具体定位问题待完善3.tomcat优化,cpu高定位解决待完善4.数据库压力大处理慢定位问题(建表不当,索引,分表,分库,读写分离,复杂业务sql)待完善5.负载均衡除了挂载vip还有其它解决方案待完善6.cookie与session差异,如何实现session超时失效(分布式session)待完善7.设计模式(策略,单...

DislodgeCocoon的博客 2936

深度学习工具包 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")

2024最全如何回答实习和项目亮点(25秋招走起~)

25秋招后端开发+面试技巧

Wangzc_1116的博客 599

mysql读写分离方案atels_GitHub - QNJR-GROUP/sharding-method at 0.3.0-alpha

核心特性全数据库全SQL兼容、完美RR级别读写分离、与原生一致的ACID特性、轻量简单易扩展另外一个轮子的意义很多人会质疑 市面上较为流行的Sharding中间件/应用层Sharing框架已经有很多,他们都已经发展了很久了,功能也很强大,为什么要一个再重复制造这么个轮子呢?之所以这里有一个新的轮子并不是因为我懒得无事,而是我对目前基于传统RDB上Sharding框架的设计的理念不太赞同,虽然他们或...

weixin_35715490的博客 157

面试指南(三):想跳槽,这些问题你会了吗?

本人目前就职于阿里巴巴,预祝最近换工作的朋友找到符合自己预期的好工作

通往精英的成长之路 1万+

Java面试体系化攻略:从知识网络构建到实战场景解析

在软件工程领域,构建稳固的知识体系是工程师应对复杂挑战的基石。其核心原理在于将离散的技术点通过逻辑关联形成网络化认知,这不仅能深化对单一概念(如数据结构或并发模型)的理解,更能提升解决综合性问题的能力。这种体系化思维的技术价值在于,它使开发者能够从底层机制(如JVM内存管理)推理出高层应用表现,并高效应对高并发、分布式等真实场景。尤其在Java开发者的职业成长与面试准备中,面对海量的八股文和层出不穷的场景题,系统化的知识网络构建成为破局关键。本文聚焦于如何将Java基础、并发编程、JVM、MySQL及Spr

weixin_30243533的博客 390

如何做好系统分析与设计

系统分析与设计的质量直接关系到项目需求落地的质量

技术进阶之路 3605

面试官:说说你的项目亮点?

项目亮点和项目难点是面试问到项目时,最常问的两个问题,因为之前的文章已经把项目难点的问题分析过了,所以咱们今天来看看怎么回答项目亮点问题。PS:项目亮点问题是一个能深度考察求职者对项目理解、技术深度掌握情况的一道经典面试题。今天,就让我们深入探讨一下如何回答这个关键问题,才能展现自己的技术实力。

2301_78976656的博客 1753

耗时4个月,阿里架构师打造java面试突击文档,10位朋友已拿offer

Java架构进阶面试及知识点文档笔记这份文档共498页,其中包括Java集合,并发编程,JVM,Dubbo,Redis,Spring全家桶,MySQL,Kafka等面试解析及知识点整理Java分布式高级面试问题解析文档其中都是包括分布式的面试问题解析,内容有分布式消息队列,Redis缓存,分库分表,微服务架构,分布式高可用,读写分离等等!互联网Java程序员面试必备问题解析及文档学习笔记Java架构进阶视频解析合集962)]Java分布式高级面试问题解析文档。

2401_84103216的博客 644

技术成长:从焦虑到自信之路

📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》、(架构篇)、作者、清华大学出版社签约作家、Java领域优质创作者、优快云博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。

我是Java程序员廖志伟,感谢朋友们的支持!不定期贡献一篇高品质、过万文字、图文并茂且附有视频解说、满载代码示例注释的良心之作,坚决杜绝粗制乱造。 701

一线互联网大厂架构师在线分享:技术储备+简历书写+投递简历+如何征服面试官拿offer!

百万年薪架构师 offer 的竞争异常激烈。成功的关键在于长期扎实的技术积累(深度+广度+系统能力)、一份能精准匹配岗位且突出价值的简历有效率的简历投递策略以及在面试中充分展现你的技术实力、思维方式和综合素质。这是一个系统工程,需要持续的努力和精心的准备。祝你求职顺利,成功斩获心仪的高薪offer!

马士兵教育 1194
上一篇: 谁写的Linux Kernel?
下一篇: TIDB小白安装手册
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值