空间数据

高性能网络通讯原理

蹲街弑〆低调 提交于 2019-12-05 12:06:14
目录 高性能网络通讯原理 前言 I/O访问 I/O模型 同步阻塞 select模型/poll模型 epoll模型 异步I/O模型 I/O线程模型 Reactor模型 Proactor模型 总结 参考文档 高性能网络通讯原理 前言 本来想对netty的源码进行学习和探究,但是在写netty之前许多底层的知识和原理性的东西理解清楚,那么对学习网络通讯框架的效果则会事半功倍。 本篇主要探讨高性能网络通讯框架的一些必要知识和底层操作系统相关的原理。在探讨如何做之前,我们先讨论下为什么要做。 随着互联网的高速发展,用户量呈指数形式递增,从原来的PC普及到现在的移动设备普及。用户量都是千万甚至亿为单位计算,尤其是实时通讯软件,在线实时互动的应用出现,在线用户数从原来的几十上百到后来的上万甚至上千万。单台服务的性能瓶颈和网络通讯瓶颈慢慢呈现。应用架构从单应用到应用数据分离,再到分布式集群高可用架构。单台服务的性能不足可以通过构建服务集群的方式水平扩展,应用性能瓶颈被很好的解决。但是横向扩展带来了直接的经济成本。 一个高性能的网络通讯框架从硬件设备到操作系统内核以及用户模式都需要精心设计。从底层的I/O访问,到操作系统内核的I/O模型,线程调度以及用户框架都需要精心设计,只要有任何地方有疏漏都会出现短板效应。 I/O访问 当我们在读取socket数据时,虽然我们在代码仅仅是调用了一个 Read

变量

不打扰是莪最后的温柔 提交于 2019-12-05 10:52:18
关于java语言当中的变量   什么是变量?     * 变量本质上来说是内存中的一块空间,这块空间有数据类型个、有名字、有字面值。     *变量包含三部分:数据类型、名称、字面值【数据】     *变量是内存中存储数据的最基本的单元。   数据类型的作用?     *不同的数据有不同的类型,不同的数据类型底层会分配不同大小的空间。     *数据类型是指导程序在运行阶段应该分配多的内存空间。   变量要求:变量中存储的具体的“数据”必须和变脸个的“数据类型”一致,当不一致的时候编译报错。   声明/定义变量的语法格式:     数据类型 变量名;         *变量名:只要合法的标识符就行。规范中要求首字母小写后面每个单词首字母大写           来源: https://www.cnblogs.com/god1/p/11921423.html

mysql物理设计

╄→尐↘猪︶ㄣ 提交于 2019-12-05 09:49:47
定义数据库,及表的命名规范: 1,数据库,表及字段的命名要遵循可读性原则, 表意性原则, 长名原则(不尽量或者不使用缩写,使用长一些的命名,这样以后会看起来更明白,但是也不太非常的长) 通一 主键的名称,比如是 id或者是 _id 等,这样比较好管理。表里面的字段命名也不需要带上表名什么的。什么意思就是什么意思就好,没必要搞得这样子。不过表命名可以 可是 模块的名称 作为前缀 ,比如有一个 模块 crm ,那么 crm 模块里面 用到的表是 user ,那么表名 就起为 crm_user这样比较好识别和 管理。 个人认为尽量不要使用 uuid 的bigint ,一般的小中型项目,int无符号都可以满足了。 对于分布式的主键呢。 一般都是使用 varchar 的 UUID,这样比较方便管理和使用对于分布式来说。 但是对于一些对接其他系统的场景,ID可能会让你痛不欲生,而洗数据也是体力活儿。如果ID过长极容易产生前端显示问题,毕竟js的long是15位的。所以实际运用中ID长度也要严格把控。所以UUID 才保存为varchar类型,而不是 bigint 这样比较方便写代码和传给客户端,不用进行 类型转换了。 文/codertom(简书作者) 原文链接:http://www.jianshu.com/p/a3828b42fce8 著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”

IO模式和IO多路复用

ぐ巨炮叔叔 提交于 2019-12-05 09:42:55
原文链接: https://www.cnblogs.com/zingp/p/6863170.html https://www.cnblogs.com/guxuanqing/p/10482066.html   网络编程里常听到阻塞IO、非阻塞IO、同步IO、异步IO等概念,总听别人装13不如自己下来钻研一下。不过,搞清楚这些概念之前,还得先回顾一些基础的概念。 回到顶部 1 基础知识回顾 注意: 咱们下面说的都是 Linux环境 下,跟Windows不一样哈~~~ 1.1 用户空间和内核空间   现在操作系统都采用虚拟寻址, 处理器先产生一个虚拟地址 ,通过 地址翻译成物理地址(内存的地址) ,再通过总线的传递,最后处理器拿到某个物理地址返回的字节。   对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用

高光谱遥感图像相关知识梳理大全

て烟熏妆下的殇ゞ 提交于 2019-12-05 07:35:02
前言 ​ 本资料整理了高光谱遥感图像概念定义、分析处理与分类识别的基本知识。第一部分介绍高光谱图像的一般性原理和知识,第二部分介绍了高光谱图像的噪声问题;第三部分介绍高光谱图像数据冗余问题以及数据降维解决冗余的方法;第四部分介绍高光谱图像的混合像元问题,对光谱解混做了一定介绍;第五部分和第六部分分别介绍了高光谱图像的监督分类和分监督分类的特点、流程和常用算法。 1.基本介绍 高光谱遥感(Hyperspectral remote sensing) 是将成像技术和光谱技术相结合的多维信息获取技术,同时探测目标的二维集合空间与一维光谱信息,获取高光谱分辨率的连续、窄波段图像数据。 高光谱图像与高分辨率图像、多光谱图像不同。 高光谱识别优势: 光谱分辨率高、波段众多,能够获取地物几乎连续的光谱特征曲线,并可以根据需要选择或提取特定波段来突出目标特征; 同一空间分辨率下,光谱覆盖范围更宽,能够探测到地物更多对电磁波的响应特征; 波段多,为波段之间的相互校正提供了便利; 定量化的连续光谱曲线数据为地物光谱机理模型引入图像分类提供了条件; 包含丰富的辐射、空间和光谱信息,是多种信息的综合载体。 高光谱在识别方面的困难: 数据量大,图像包含几十个到上百个波段,数据量是单波段遥感图像的几百倍;数据存在大量冗余,处理不当,反而会影响分类精度;

Oracle的高水位线

心不动则不痛 提交于 2019-12-05 07:10:24
一、什么是水位线 所有的oracle段都会有一个在段内容纳数据的上线,把这个上限成为“high water mark”,这是一个标记,用来说明已经有多少没有使用的数据块分配给这个段,原则上high water mark只会增大,不会减小,即使delete将表中的数据全部删除,high water mark还是原值,这就使得high water mark就像水库的历史最高水位,但是如果使用truncate,该表的high water mark就会被重置成0. 二、数据库操作的影响 1)全表扫描通常要读出HWM标记的所有属于该表的数据库快,即使该表没有任何数据 2)即使HWM以下有空闲的数据库块,在插入时使用的是HWM以上的数据块,此时HWM会自动增大 三、如何知道一个表的HWM? 1)首先对表进行分析 ANALYZE TABLE <TABLENAME> ESTIMATE/COMPUTE STATISTICS 2)SELECT BLOCKS,EMPTY_BLOCKS,NUM_ROWS FROM USER_TABLES WHERE TABLE_NAME = <TABLENAME> SELECT BLOCKS,--水位线 EMPTY_BLOCKS,--从来没有使用过的数据块 NUM_ROWS FROM USER_TABLES WHERE TABLE_NAME = 'TP_WLJR0005'

哈希表(hash)详解

为君一笑 提交于 2019-12-05 05:28:44
哈希表结构讲解: 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 记录的存储位置 = function(关键字) 这里的对应关系function称为散列函数,又称为哈希(Hash函数),采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表(Hash table)。 哈希表hashtable(key,value) 就是把Key通过一个固定的算法函数function既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行 取余 ,取余结果就当作数组的 下标 ,将value存储在以该数字为下标的数组空间里。(或者:把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出 ,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。) 而当使用哈希表进行 查询的时候,就是再次使用哈希函数将key转换为对应的数组下标【仍通过映射哈希函数function】

C++基础(对象和类)

為{幸葍}努か 提交于 2019-12-05 02:05:22
类的数据成员是不能在声明类时初始化的 。类的数据成员只是这个类的对象的一些属性声明。每个对象的属性值都是不相同的。 类只是一个数据模板。声明类时并没有申请存储空间,只有类定义一个对象时,才申请空间。 成员函数是用来对数据成员进行操作的,又称为方法。 所创建的每个新对象都有自己的存储空间,用于存储其内部变量和类成员 。但同一个类的所有对象共享同一组类方法,即每种方法只有一个副本。 Sum make,jock; // 创建两个对象 两个对象将占据两块不同的内存块,但 make.show() 和 jock.show() 都调用同一个方法,它们将执行同一个代码块,只是将这些代码用于不同的数据。 要创建类对象,可以声明类变量,也可以使用 new 为类对象分配存储空间。 可以将对象作为函数的参数和返回值,也可以将一个对象赋给另一个对象。 通常,数据成员被放在私有部分中,成员函数被放在共有部分中。 公有部分的内容构成了设计的抽象部分 —— 公有接口。将数据封装到私有部分中可以保护数据的完整性,这就被称为数据隐藏。 对象 ( 实例 ) 调用成员函数时,每当成员函数中的代码引用某个数据成员时,该函数都将使用对象中相应成员的值。 来源: https://www.cnblogs.com/tingtaishou/p/11896830.html

压缩20M文件从30秒到1秒的优化过程

痴心易碎 提交于 2019-12-05 01:54:47
文章来源公众号: IT牧场 有一个需求需要将前端传过来的10张照片,然后后端进行处理以后压缩成一个压缩包通过网络流传输出去。之前没有接触过用Java压缩文件的,所以就直接上网找了一个例子改了一下用了,改完以后也能使用,但是随着前端所传图片的大小越来越大的时候,耗费的时间也在急剧增加,最后测了一下压缩20M的文件竟然需要30秒的时间。压缩文件的代码如下。 public static void zipFileNoBuffer() { File zipFile = new File(ZIP_FILE); try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile))) { //开始时间 long beginTime = System.currentTimeMillis(); for (int i = 0; i < 10; i++) { try (InputStream input = new FileInputStream(JPG_FILE)) { zipOut.putNextEntry(new ZipEntry(FILE_NAME + i)); int temp = 0; while ((temp = input.read()) != -1) { zipOut.write(temp); }

压缩20M文件从30秒到1秒的优化过程

只谈情不闲聊 提交于 2019-12-05 01:54:33
文章来源公众号: IT牧场 有一个需求需要将前端传过来的10张照片,然后后端进行处理以后压缩成一个压缩包通过网络流传输出去。之前没有接触过用Java压缩文件的,所以就直接上网找了一个例子改了一下用了,改完以后也能使用,但是随着前端所传图片的大小越来越大的时候,耗费的时间也在急剧增加,最后测了一下压缩20M的文件竟然需要30秒的时间。压缩文件的代码如下。 public static void zipFileNoBuffer() { File zipFile = new File(ZIP_FILE); try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile))) { //开始时间 long beginTime = System.currentTimeMillis(); for (int i = 0; i < 10; i++) { try (InputStream input = new FileInputStream(JPG_FILE)) { zipOut.putNextEntry(new ZipEntry(FILE_NAME + i)); int temp = 0; while ((temp = input.read()) != -1) { zipOut.write(temp); }