解决无法访问服务器IPV6地址的问题

解决无法访问服务器IPV6地址的问题 场景: 使用Redis、Mongo的可视化工具,通过服务器公网IP进行连接。每次请求都连接超时。 架构: 服务器:CentOS 7Redis、Mongo 创建在Docker容器中; 解决连接不上问题: 查看服务器的端口: 执行:netstat -ntlp 可以看出 这两个端口 都是绑定在ipv6地址上面 看看应用程序是否只能bind在ipv6上面: 执行命令:sysctl net.ipv6.bindv6only net.ipv6.bindv6only = 0 =0 ,可以看出并不是程序仅能bind ipv6上 看看ipv4是否能够转发: 执行命令:sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 0 =0,可以看出ipv4不能够进行转发 在阿里云后台上,安全组织列表,出、入方向都是ipv4地址段访问; 找到了问题,将ipv4转发包进行配置就可以了。 解决方案: 1.修改:vim /etc/sysctl.conf 文件 2.将net.ipv4.ip_forward=1添加到sysctl.conf文件中 3.然后重启网络: 执行命令:systemctl restart network 4.这样再次执行:sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1 通过外网IP连接可视化工具都可以了。 总结: 访问云主机的时候是通过IPV4访问的,但是我的主机没有开启IPV4的IP包转发,导致我的Redis、Mongo因为bind在一个IPV6的地址上,所以接收不到任何IP包; 开启IPV4转发就OK了,有些服务器默认是不开启的,需要自行配置;

yum install nginx --add fastdfs-nginx-module

1.查看安装参数 /usr/sbin/nginx -V nginx version: nginx/1.16.1 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) built with OpenSSL 1.0.2k-fips 26 Jan 2017 TLS SNI support enabled configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' 2.

(1)区间完全覆盖问题(最少)

//核心就是找右端点最大值 #include<stdio.h> #include<algorithm> #define N 1005 using namespace std; struct Node { int left,right; } str[N]; bool cmp(Node x,Node y) {//左从小到大 相等时右按照从小到大 if(x.left==y.left) { return x.right<y.right;//别忘了return!!! } else { return x.left<y.left; } } int main() { freopen("in1.txt","r",stdin); freopen("out1.txt","w",stdout); int L,m; scanf("%d %d",&L,&m);//L长度 n个线段 for(int i=0; i<m; i++) { scanf("%d %d",&str[i].left,&str[i].right); } sort(str,str+m,cmp); // for(int i=0; i<m; i++) { // printf("%d %d\n",str[i].left,str[i].right); // } int index=0,max=0,num=0;//index作为一个参照(=0代表线段从0开始 =1代表线段从1开始) // max为了得到左端点符合的条件下右端点的最大值 num记下需要的段数 for(int i=0; i<m; i++) { if(str[i].

Ubuntu18.04+Docker+Hadoop+Spark分布式集群搭建

题前记:因为课程需求,下面将搭建过程用学术论文的格式写。(其实我并不想写的,没办法,学习作业嘛QAQ。。。) 我的联系方式:630056108 文章目录 Docker上的Hadoop大数据平台搭建与测试1. 简介与原理1.1 Docker介绍1.1.1 容器1.1.1.1 容器历史1.1.1.2 容器原理 1.1.2 Docker1.1.2.1 Docker历史1.1.2.2 Docker原理 1.2 Hadoop简介1.2.1 Hadoop历史1.2.2 Hadoop架构1.2.2.1 Hadoop的文件系统核心模块1.2.2.2 Hadoop的数据计算核心模块 1.2.3 Hadoop运行流程 2. 环境搭建2.1 本机环境2.2 物料说明2.3 安装基本环境2.4 测试环境 3. 总结附录1 Docker常用命令附页2 Hadoop常见命令参考文献(章) Docker上的Hadoop大数据平台搭建与测试 摘要:Docker是一个开源的应用容器,它可以让开发者将应用及其所需的依赖包打包到一个可移植的镜像中,可实现虚拟化。Hadoop是一开源的分布式系统基础架构,用于分布式计算,它可以给用户提供集群的高速运算和存储。本文简要介绍了Docker和Hadoop的发展史,Docker的架构,Hadoop的模块组件。并最终一步步搭建了Docker和Hadoop集群,并进行了测试。 大数据有四大特点(4V),分为别为:Volume(大量)、Variety(多样)、Velocity(高速)、Veracity(准确性)。新的特点需要使用新的技术,传统的HPC计算已经难以应付4V的挑战,相应而生的分布式计算架构很好地应对了问题。Hadoop便是其中之一的分布式架构平台,它有高可靠、高扩展、高效、高容错、低成本等优点,越来越受到关注与应用。 本文首先简述了容器和Docker与Hadoop的发展史,其次概述了Docker与Hadoop的架构模块,然后详细描述如何在真机上搭建环境并测试,最后进行总结和展望。 1. 简介与原理 1.1 Docker介绍 Docker 是一种运行于 Linux 和 Windows 上的软件,用于创建、管理和编排容器。是在 GitHub 上开发的 Moby 开源项目的一部分。 1.1.1 容器 容器(Coninter)是一种在单个系统上提供多个隔离的系统环境的技术。 1.1.1.1 容器历史 容器最早提出于1979年的Unix chroot。它是一个 UNIX 操作系统上的系统调用,用于将一个进程及其子进程的根目录改变到文件系统中的一个新位置,让这些进程只能访问到该目录。这个功能的想法是为每个进程提供独立的磁盘空间。 随后有2000 — FreeBSD Jails、2001 — Linux VServer、2004 — Solaris Containers、2005 — OpenVZ、2006 — Process Containers、2007 — Control Groups、2008 — LXC、2011 — Warden、2013 — LMCTFY、2013 — Docker、2014 — Rocket、2016 — Windows Containers。

Stanford CS143 Compiler Fall2014 个人笔记

文章目录 introduction1.1 编译器的结构 3. 词法分析Lexical Analysis3.1 词法分析的目的3.1.1 名词释义3.1.2 词法分析概要3.1.3 词素例子 3.2 词法分析例子3.2.1 FORTRAN3.2.2 PL/13.2.3 C++ 3.3 正规语言3.3.1 正规表达式3.3.1.1 正规表达式Regular Expressions3.3.1.2 正规表达式的操作3.3.2 正规语言Formal Languages3.3.2.? Meaning Function L 3.3.3 正规表达式如何说明编程语言中的不同方向 3.4 词法规范(lexical specification)CTMD垃圾CSDN,Ctrl+S不能保存,写了1000多字全没了。。。。Scheiße! 4 语法分析4.1 上下文无关文法4.1.1 结构4.1.2 二义文法 4.2 处理问题4.2.1 问题的种类4.2.2 处理问题需要做的事4.2.3 处理问题的方法4.2.3.1 恐慌模式Panic mode4.2.3.2 错误产生式 Error Productions4.2.3.3 自动的局部或全局矫正 Automatic local or global correction4.2.3.4 过去和现在比较 4.3 语法树4.4递归下降的语法分析(自顶向下的语法分析)4.4.2 举一个RD algorithm例子4.4.3 消除左递归(left recursion) introduction Deference between Compilers with Interpreters Compiler is off-line, and it’s imput is “program” then compiler it to exec witch can coculate Data to Output.

Hbase与Hive的联系与区别

Hbase与Hive的联系与区别 区别: Hbase: 1.属于非关系型数据库,没有数据格式。 2.是纯数据库,可以对每条数据进行curd。 3.能大量存储数据且查询速度非常快(低延时),具有高可靠性,适合时时查询,但不能进行数据处理 HIve: 1.属于关系型数据库,天生决定存储不了大的数据(尤其是大量的结构化不严谨的数据) 2.能够进行查询,不能进行单一的删除修改。但可以通过mr对离线数据进行分析 联系: 底层都是基于HDFS进行存储

因果推断——简介

1. 因果推断是什么? 1.1 因果性与相关性 事件/变量之间的关系,最主要的有相关性和因果性。 相关性是指在观测到的数据分布中,X与Y相关,如果我们观测到X的分布,就可以推断出Y的分布因果性是指在操作/改变X后,Y随着这种操作/改变也变化,则说明X是Y的因cause 在常用的机器学习算法中,关注的是特征之间的相关性,而无法去识别特征之间的因果性,而很多时候在做决策与判断的时候,我们需要的是因果性。 举个例子,我们会发现在学校中,近视的同学成绩更好。近视和成绩好之间有强相关性,但显然近视不是成绩好的原因。而我们想要提升学生成绩,自然需要找到因,否则就会通过给学生戴眼镜的方式来提高成绩。 上面的例子是很明显地可以区分出相关与因果的,但是也有很多难以区分的,如经常喝葡萄酒的人寿命更长,是因为葡萄酒确实能延长寿命,还是因为能经常喝的人通常更富有,享有更好的医疗条件。 1.2 识别因果的必要性 很多时候,我们通过统计学方法或者机器学习算法得到的特征之间的相关性,就足以为我们的验证、决策提供指导,比如,我们通过数据发现,用户曝光的图片越多,留存越高,我们不需要知道这之间是否有复杂的因果关系,只需要通过简单的ABtest来检验更多的曝光是否有效果即可。 是否还有必要去识别因果性呢?答案是有的。 很多时候,我们需要确切地知道因果性,且无法通过ABtest简单地判断,比如: 药物是否有效、政策是否有效,这种问题无法做ABtest新的推荐算法是否有效,ABtest成本高(不好的用户体验等)…… 因此,面对这种特殊的问题,我们需要从已有的数据中推断出变量间的因果性。 1.3 本质是对因果效应的估计 前面说了因果性和相关性的区别、以及识别因果性的必要性,那么因果推断究竟是什么? 因果推断的核心思想在于反事实推理counterfactual reasoning,即在我们观测到X和Y的情况下,推理如果当时没有做X,Y'是什么。 因果推断的目的是要判断因果性,即计算因果效应(有无X的情况下Y值的变化量)。在进行反事实推理后,可得出因果效应e = |Y - Y'|,进而判断因果性。 实际上,对于一个对象,我们永远只能观察到Y和Y'的其中一个,因果推断所做的就是从已有数据中估计因果效应,所以我认为因果推断的本质是,对因果效应的估计。 2. 一些因果推断的方法 上一部分对因果推断做了简单的介绍,本部分主要介绍一些因果推断的方法,如下图所示—— 2.1 随机实验Randomization 2.1.1 A/B Test 以推荐算法为例,判断推荐算法是否有效,ABTest通过将用户随机分为两组,分别应用不同的算法,通过判断两组用户点击率的差异来估计因果效应。通过随机分组,排除了混淆变量的影响。 A/B Test实际上是判断因果性的很有效的方法,但有时候成本过高无法采用,如这里的推荐算法—— 可能新的推荐算法太差导致用户流失如果有很多新的算法要测试,A/B Test效率较低 2.2.1 多臂老虎机 Multi-armed bandits 针对上述问题,另一种随机实验方法是强化学习中的多臂老虎机,实际上是对explore和exploit的平衡。 explore,随机选择一个动作,在上面的问题中是随机选择一个算法exploit,选择收益最高的动作,在上面的问题中是选择当前效果最好的算法 通过某种规则(e-greedy等)重复上述过程,优点是可以同时测试多种算法,并且每个用户都能使用到最好的算法,减少流失可能性。缺点是效果难以评估,也很难让用户按照我们的想法行动。 2.2 自然实验Natural Experiments 理想的实验需要:随机分配(分组)、人为干预(施加不同的treatment)、结果比较, 自然实验实际上是一种观察性研究,满足上述三个条件中的两个,是指不加干预地、实验对象**“自然”**地分为若干组,对实验对象的结果进行观察比较。 显然自然实验法的关键在于,实验对象是否能“自然”/随机地分组。比如,将是否民主将国家分为两组,探究制度与国家对外战争的关系。但是在这里,是否民主不是随机的分给各个国家,所以无法满足自然实验所需的随机分配原则。 2.2.1 断点回归Regression discontinuity 断点回归是自然实验中的一种观察方法,简单理解就是在回归过程中,观察在临界点处是否出现断层/断点。 举一个简单的例子,假设现在有一个产品,收集500个金币后就可以得到一个勋章,现在要判断有无勋章对用户在线时长的影响。 断点回归法观察金币在500附近的用户,如497到502,观察【接近500但小于500(无勋章)】与【接近500但大于500(有勋章)】的用户在线时长是否有显著区别,若有,说明有勋章很可能会增加用户的在线时长。 2.2.2 工具变量Instrumental Variables 对于要判断因果关系的两个变量间,如果存在其他混淆变量,在计量经济学中采用工具变量的方法解决。 以下述关系为例,要判断对APP1的访问,是否会导致对APP2的点击。实际上由于APP1和APP2之间的需求关系,误差项与解释变量相关,即计量经济学中的内生性。 引入工具变量的目的是为了让误差项与解释变量不相关。具体地,通过找到一个变量,满足与解释变量相关且与误差项无关,那在引入这一变量之后,解释变量变化的部分就与误差项无关。 同样是上面的例子,假设某一天有个活动,下载APP1的人有奖励,这个活动与解释变量相关,但不会影响到APP2的需求,那根据多出来的APP1访问量与多出来的APP2点击率就不再受到需求关系的影响,就可以判断对APP1的访问,是否会导致对APP2的点击。 2.3 Conditioning 2.3.1 分层Stratification 分层的核心思想是控制条件变量,一般步骤如下:

Python之多进程(multiprocessing)学习【5】:共享内存,锁

一. 共享内存 在多进程中,如果我们想要定义一个全局变量,让他在各个进程之间进行交流是不行的,所以我们就引入了一个新的概念,全局变量,通过v = mp.Value() 定义了一个全局变量。括号里有参数,后面代码会体现出来。这样它才能够供你提供的cpu内核去使用,并且使用的是同样的内存。 二. 锁 如果你不想你的共享内存被各个进程影响,或者说你不想各个进程之间互相干扰,那么就需要锁这个东西。 三. 代码 import multiprocessing as mp import time def job(v,num,l): l.acquire() for _ in range(10): time.sleep(0.2) v.value+=num print(v.value) l.release() def multicore(): l = mp.Lock() v = mp.Value('i',0) # 定义一个共享内存,值为int型的0 p1 = mp.Process(target=job,args=(v,1,l)) p2 = mp.Process(target=job,args=(v,3,l)) p1.start() p2.start() p1.join() p2.join() if __name__ == '__main__': multicore() 四. 运行结果

Flume之flume-ng

Flume —flume-ng 在开始阅读之前让我们喊出口号:“要想人前显贵,就要人后受罪!”加油嘎嘣儿,加油所有想获得美好未来的你! 一、什么是Flume Flume 是Cloundera提供的一个高可用,高可靠的分布式海量日志采集、聚合和传送系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方的能力。 二、Flume-ng 运行原理图: 其中Agent 是Flume-ng的最小的独立运行单位。Agent是Flume中产生数据流的地方,一个agent就是一个jvm。单个的Agent由 Source、Sink、和Channel三大组件构成。 二、三大组件 Source:完成对日志数据的收集,通过event将数据传给到Channel之中。Channle:主要提供一个队列的功能,对source提供中的数据进行简单的缓存。Sink:取出Channle中的数据,进行相应的存储文件系统,数据库,或者提交到远程服务器。 Source :常用类型 Avro Source通过Avro 接口远程连接SourceExec Source通过UNIX命令想标准输出输出数据Spooling Directory Source监听整个目录,将新文件内容发送给EventSyslog Sources读取syslog数据,产生Event,支持UDP和TCPHTTP Source基于HTTP POST或GET方式的数据源,支持JSON、BLOB表示形式自定义Source通过实现Flume提供的接口定制Source Channel:常用类型 Memory ChannelEvent数据存储在内存中JDBC ChannelEvent数据存储在持久化存储中File ChannelEvent数据存储在磁盘中 Sink:常用类型 Hdfs Sink将数据写入到Hdfs中Avro Sink数据被转换成Avro Event,然后发送到配置的RPC端口上Hbase Sink将数据写入到Hbase数据库中File Roll Sink将数据写入到本地文件系统中

Vue.js安装

一 独立安装 我们可以在 Vue.js 的官网上直接下载 vue.min.js 并用 <script> 标签引入。 Vue.js下载位置:https://vuejs.org/js/vue.min.js 二 使用CDN方法 1 CDN介绍 CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。 2 CDN位置: Staticfile CDN(国内) : https://cdn.staticfile.org/vue/2.2.2/vue.min.js unpkg:https://unpkg.com/vue/dist/vue.js, 会保持和 npm 发布的最新的版本一致。 cdnjs : https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.8/vue.min.js 三 使用CDN范例 1 代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Vue 使用CDN</title> <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script> </head> <body> <div id="app"> <p>{{ message }}</p> </div> <script> new Vue({ el: '#app', data: { message: 'Hello Vue.js!' } }) </script> </body> </html> 2 输出

HNU君陌:写一点文艺的东西

许久未动笔,就写一点曾经非常喜欢的一句诗吧。 雨霖霖(寒蝉凄切·柳永)里面的那句“今宵酒醒何处,杨柳岸晓风残月”。曾经在高中语文课上做过续写,这里就重温一下,写一点玩一玩吧。各位就看个乐呵好了。 原诗:今宵酒醒何处,杨柳岸晓风残月。 白话文扩写: 残月当空,清清冷冷的月光散下,雾气般朦胧了江面。两岸的杨柳扰动着空气中仍旧清淡的酒香,不经意般的拨动了忧伤的琴弦。一叶小舟自雾气最深处凝出,在这镜般梦幻的江面上,仿佛在停,又仿佛在走。船上,残烛吐露着徐徐的青烟,在船梁上打着旋,和昨夜的琴声缠绵。环指处的酒壶上下摇曳,似那渔翁的钓竿,一起一伏之间,时光被风月吹散。清烟,冷月,杨柳依依;晓风,残酒,烛影斜斜,你在哪里?而我,又在哪里? 本人自知文笔拙劣,难登大雅之堂,恳请诸位笔下留情,权当游戏打趣即可

大学物理——原子间相互作用力

一、四种基本的相互作用: 目前物理界公认,世界存在四种基本的相互作用:引力相互作用、电磁相互作用、强相互作用、弱相互作用。电磁相互作用和引力相互作用都是远程力,理论上作用范围是无限的。强相互作用和弱相互作用都是短程力,理论作用范围是微观世界。在宏观世界中只有引力和电磁力可以表示。在微观的粒子物理的量子化中四种基本相互作用均有表现。 二、夸克: 质子中子再分后的组成物质,目前人们已发现并相信只有六种种类(夸克的种类称为味):上、下、奇、粲(can)、底、顶。夸克的质量极小,且多带有不为整数量的电荷量。夸克与夸克组合形成具有质量的强子(质子中子之类)。 三、引力相互作用: 引力是宇宙万物均存在的一种力,只要有质量就会具有引力。引力公式中表示引力只与两相互作用的物体的质量和距离有关。由于引力常量很小,故一般宏观世界中引力十分微弱,但当联系到天体物理研究天体运动时引力就成为决定天体与物体之间相互作用与运动形态的主要因素。 个人理解引力的原因:宇宙可以视作由无数个薄膜一般的空间叠加堆积而成(平行宇宙论),由于物体质量的存在,使空间产生了一处凹陷,故对周围的物体会有沿着凹陷空间运动的趋势。 四、电磁相互作用: 电磁相互作用包括静止电荷之间的相互作用,运动的带电粒子之间的相互作用。例如磁力,库仑力,电场力,洛仑磁力都是电磁相互作用的宏观表示,而接触力也可视作是大量原子分子之间的电磁相互作用的宏观表示。 个人理解电磁相互作用的原因:带电粒子在空间中产生相对于距离减弱的光子场,光子在场中相互碰撞产生能量,对场中的物体产生力的作用。 五、弱相互作用: 在粒子物理学的标准模型中,弱相互作用的理论是它是由w及z玻色子的交换(发射及吸收)所引起的,是一种非接触力。β衰变是放射性的一种表现,也是弱相互作用的一种表现形式。弱相互作用共有两种。第一种叫“载荷流相互作用”,因为负责传递它的粒子带电荷(W+或W−),β衰变就是由它所引起的。第二种叫“中性流相互作用”,因为负责传递它的粒子,Z玻色子,是中性的(不带电荷)。 六、强相互作用: 原子核内质子、中子间的核力,是结合成原子核的作用力。主要原因是由于强子(质子中子)是由夸克组成的,强作用是夸克之间的相互作用力。是一种色相互作用,具有色荷的夸克所具有的相互作用,作用的媒介粒子是介子。

垃圾回收机制与调用System.gc()区别

java垃圾回收与System.gc()介绍 垃圾回收机制: 1.垃圾收集算法的核心思想 Java语言建立了垃圾收集机制,用以跟踪正在使用的对象和发现并回收不再使用(引用)的对象。 该机制可以有效防范动态内存分配中可能发生的两个危险:因内存垃圾过多而引发的内存耗尽,以及不恰当的内存释放所造成的内存非法引用。 垃圾收集算法的核心思想是: 对虚拟机可用内存空间,即堆空间中的对象进行识别,如果对象正在被引用,那么称其为存活对象,反之,如果对象不再被引用,则为垃圾对象,可以回收其占据的空间,用于再分配。 2.触发主GC(Garbage Collector)的条件 JVM进行次GC的频率很高,但因为这种GC占用时间极短,所以对系统产生的影响不大。更值得关注的是主GC的触发条件,因为它对系统影响很明显。总的来说,有两个条件会触发主GC: ①当应用程序空闲时,即没有应用线程在运行时,GC会被调用。因为GC在优先级最低的线程中进行,所以当应用忙时,GC线程就不会被调用,但以下条件除外。 ②Java堆内存不足时,GC会被调用。当应用线程在运行,并在运行过程中创建新对象,若这时内存空间不足,JVM就会强制地调用GC线程,以便回收内存用于新的分配。若GC一次之后仍不能满足内存分配的要求,JVM会再进行两次GC作进一步的尝试,若仍无法满足要求,则 JVM将报“out of memory”的错误,Java应用将停止。 由于是否进行主GC由JVM根据系统环境决定,而系统环境在不断的变化当中,所以主GC的运行具有不确定性,无法预计它何时必然出现,但可以确定的是对一个长期运行的应用来说,其主GC是反复进行的。 3.减少GC开销的措施 根据上述GC的机制,程序的运行会直接影响系统环境的变化,从而影响GC的触发。(若不针对GC的特点进行设计和编码,就会出现内存驻留等一系列负面影响。) 为了避免这些影响,基本的原则就是尽可能地减少垃圾和减少GC过程中的开销。具体措施包括以下几个方面: (1)不要显式调用System.gc() 此函数建议JVM进行主GC,虽然只是建议而非一定,但很多情况下它会触发主GC,从而增加主GC的频率,也即增加了间歇性停顿的次数。 (2)尽量减少临时对象的使用 临时对象在跳出函数调用后,会成为垃圾,少用临时变量就相当于减少了垃圾的产生,从而延长了出现上述第二个触发条件出现的时间,减少了主GC的机会。 (3)对象不用时最好显式置为Null 一般而言,为Null的对象都会被作为垃圾处理,所以将不用的对象显式地设为Null,有利于GC收集器判定垃圾,从而提高了GC的效率。 (4)尽量使用StringBuffer,而不用String来累加字符串 由于String是固定长的字符串对象,累加String对象时,并非在一个String对象中扩增,而是重新创建新的String对象(如 Str5=Str1+Str2+Str3+Str4,这条语句执行过程中会产生多个垃圾对象,因为对次作“+”操作时都必须创建新的String对象,但这些过渡对象对系统来说是没有实际意义的,只会增加更多的垃圾)。避免这种情况可以改用StringBuffer来累加字符串,因StringBuffer 是可变长的,它在原有基础上进行扩增,不会产生中间对象。 (5)能用基本类型如Int,Long,就不用Integer,Long对象 基本类型变量占用的内存资源比相应对象占用的少得多,如果没有必要,最好使用基本变量。 (6)尽量少用静态对象变量 静态变量属于全局变量,不会被GC回收,它们会一直占用内存。 (7)分散对象创建或删除的时间 集中在短时间内大量创建新对象,特别是大对象,会导致突然需要大量内存,JVM在面临这种情况时,只能进行主GC,以回收内存或整合内存碎片, 从而增加主GC的频率。集中删除对象,道理也是一样的。它使得突然出现了大量的垃圾对象,空闲空间必然减少,从而大大增加了下一次创建新对象时强制主GC 的机会。 System.gc()使用介绍: Java中的内存分配是随着new一个新的对象来实现的,这个很简单,而且也还是有一些可以“改进”内存回收的机制的,其中最显眼的就是这个System.gc()函数。 其实这个gc()函数的作用只是提醒虚拟机:程序员希望进行一次垃圾回收。但是它不能保证垃圾回收一定会进行,而且具体什么时候进行是取决于具体的虚拟机的,不同的虚拟机有不同的对策。 gc()进行回收的准则是什么?也就是说什么样的对象可以被回收? 简单来说就是:没有被任何可达变量指向的对象。这里的可达是意思就是能够找到的(没有任何可达变量指向你,你还有活下去的理由吗?你就算活下去谁能找得到你呢?) 所以说,C++中将释放了的指针置为null的习惯要保留到Java中,因为这有可能是你释放内存的唯一途径。 不要频繁使用gc函数。 保持代码健壮(记得将不用的变量置为null),让虚拟机去管理内存

python 算法篇_选择排序

选择排序逻辑:第一次从待排序的列表中选出最小的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零 举例说明:1,2,3进行比较,需要1和2比,1和3比,2和3比,3不需要在和其他数字进行比较,比较完成。 例子 :list=[4,2,5,7,3,1] 由简到难,第一步:i=0,我先开始 list[i] 和 所有对象的比较, 第二步:我们循环 len(list)-1 次 第一步,最后一个元素不需要再进行比较(参考举例说明) 第一步流程图部分: 第二步流程图: 代码如下: list = [4, 2, 5, 7, 3, 1] # 第一种选择排序:第i个数和i以后的 所有位置数据进行对比 for i in range(0, len(list)-1): a = list[i] # 第一个数与第二个数进行对比,大的话排到最后 for j in range(i + 1, len(list)): b = list[j] if (a > b): list[i], list[j] = list[j], list[i] a = list[i] print(list)

Matlab:结构数组

一、知识点 1、结构数组的定义: 对某个对象,不同属性的数据,用一组数据来表示,这样的一组数据叫做结构数组。(结构数组中的元素既可以是数值,也可以是字符串,生活中常见的例如:检测数据、产品档案、人事档案······) 2、 有关结构数据的函数: 3、结构数组的创建: 1)直接赋值 2)用函数struct创建(函数struct的一般格式为: ) 4、结构数组与单元数组的转换: (函数名中的“2”可以这样记:(from) struct to cell的to与two发音相近,由此可解释“2”的由来) 5、单元数组的数据处理: Matlab的单元数组虽然有类似于Excel的功能,但其统计分析的功能不如Excel。要想使用均值函数mean对单元数组中的元素进行操作, 必须将单元数组中的数值转换成数值向量,随后进行数值运算。 二、实例演练 1、 2、构建结构数组student,其中包含学生ID,学生姓名(各数据见下表) 【注意:创建结构数组的一般步骤为: 1、键入结构数组各元素的数据(格式见上图工作区); 2、在命令行使用struct函数构建结构数组(格式见上图工作区) 】 3、将例2中的结构数组转换为单元数组A,并显示单元数组A 【使用struct2cell() 函数】 4、构建1*4单元数组,命名为Score,键入四名同学成绩,再计算他们的平均成绩。 三、总结思考 1、MATLAB结构数组有OOP的“味道”在里面,可以借助c++的相关概念来理解。 2、程序无法正常运行,要首先检查语句使用的参数是否符合相关要求, 再考虑算法问题,最后若依旧解决不了,可以百度。

查看进程打开的文件描述符

lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。 可用来查看当前进程发起的对外的连接信息。 输出信息含义 在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。 直接输入lsof -p 1272部分输出为: 每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。 lsof输出各列信息的意义如下: COMMAND:进程的名称 PID:进程标识符 USER:进程所有者 FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等 TYPE:文件类型,如DIR、REG等 DEVICE:指定磁盘的名称 SIZE:文件的大小 NODE:索引节点(文件在磁盘上的标识) NAME:打开文件的确切名称 FD 列中的文件描述符cwd 值表示应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改,txt 类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序。 其次数值表示应用程序的文件描述符,这是打开该文件时返回的一个整数。如上的最后一行文件/dev/initctl,其文件描述符为 10。u 表示该文件被打开并处于读取/写入模式,而不是只读 ® 或只写 (w) 模式。同时还有大写 的W 表示该应用程序具有对整个文件的写锁。该文件描述符用于确保每次只能打开一个应用程序实例。初始打开每个应用程序时,都具有三个文件描述符,从 0 到 2,分别表示标准输入、输出和错误流。所以大多数应用程序所打开的文件的 FD 都是从 3 开始。 与 FD 列相比,Type 列则比较直观。文件和目录分别称为 REG 和 DIR。而CHR 和 BLK,分别表示字符和块设备;或者 UNIX、FIFO 和 IPv4,分别表示 UNIX 域套接字、先进先出 (FIFO) 队列和网际协议 (IP) 套接字。 常用参数

python和pycharm报错解决

python: can’t open file ‘h.py’: [Errno 2] No such file or directory 解决方法: 1.文件、文件夹命名不可以使用空格,例如"Python Files"中的空格就是错误的。 应该用下划线代替空格,例如:“Python_Files”。 PyCharm:ModuleNotFoundError: No module named 'selenium’ 解决方法: 点击File -> Settings。找到Project Interpreter,点击右侧的 + 号。在搜索框中输入 selenium,选中要安装的 selenium,点击下方的 Install Package,稍等片刻即可安装成功。安装成功后可看到 Package 中已经有 selenium 了

matlab对点云进行三角化(las格式读入)

1、LASread_and_convert.m文件(运行这个文件实现las读入为mat文件) clear; clc; close all; clear all; A = LASreadAll('house_wall.las');%调用函数读取las文件 Point_City = [A.x,A.y,A.z]; save Point_City.mat; %将X1_buny赋值给一个p p = Point_City; %显示点云 figure(1); hold on axis equal title('点云','fontsize',14) plot3(p(:,1),p(:,2),p(:,3),'g.')%这里颜色如果是 ‘r’就不行??? view(-37.5,30) [t]=MyCrust(p); %% plot of the oyput triangulation figure(2) hold on title('三角化输出','fontsize',14) axis equal trimesh(t,p(:,1),p(:,2),p(:,3),'edgecolor','b')%plot della superficie trattata view(-37.5,30) 2、LASreadAll函数 function A = LASreadAll(infilename) % LASREADALL reads in all variables from a LAS 1.x data file (used with lidar data) % % INPUT % infilename: input file name (for example, 'myinfile.

高通 gpio控制方式

前言 随着内核的发展,linux驱动框架在不断的变化。很早很早以前,出现了gpio子系统,后来又出现了pinctrl子系统。对于一个驱动工程师来说,如何利用系统提供出来的api去进行控制gpio的状态,在这里总结几种方式。(希望总结的有点深度,但是实力不允许,继续努力!!!) gpio介绍 gpio是我们最常提及的,但对于gpio的介绍,我想在这里引用下大牛的总结,感谢蜗窝科技。对于不同的硬件芯片,它所呈现的IO Port是不同的。 1、和CPU的连接方式不同 对于ARM的嵌入式硬件平台,SOC本身可以提供大量的IO port,SOC上的GPIO controller是通过SOC的总线(AMBA)连接到CPU的。对于嵌入式系统而言,除了SOC的IO port,一些外设芯片也可能会提供IO port,例如: (1)有些key controller芯片、codec或者PMU的芯片会提供I/O port (2)有些专用的IO expander芯片可以扩展16个或者32个GPIO 当然这些IO Port的控制方式自然是不同的,比如有些IO expander芯片,是由i2c或者spi去和主cpu连接的。codec芯片有可能是PDM总线连接等。 2、访问方式不同 追根溯源,我们操控gpio口,都是去操控IO所对应的寄存器,只是不同的芯片对寄存器bit位的定义不同 3、配置方式不同 即便是使用了同样的硬件(例如都使用同样的某款SOC),不同硬件系统上GPIO的配置不同。在一个系统上配置为输入,在另外的系统上可能配置为输出。 4、GPIO特性不同。这些特性包括: (1)是否能触发中断 (2)如果能够触发中断,那么该GPIO是否能够将CPU从sleep状态唤醒 (3)有些有软件可控的上拉或者下拉电阻的特性,有的GPIO不支持这种特性。在设定为输入的时候,有的GPIO可以设定debouce的算法,有的则不可以。 (4)多功能复用 截取一个高通sdm660的GPIO Configuration Spreadsheet 更正:MPM interrupt = Y,是指可配置可唤醒中断 gpio子系统控制方式 上面也说了,操控SOC上的gpio,最终控制的就是IO对应的寄存器。 针对你所使用的平台,找到gpio 硬件寄存器手册,找到对应gpio的基地址。 如上图:660平台,gpio的基地址就是0x03100000。 比如讲gpio62的地址是多少,0x03100000 + (num)*1000=0x0313e000 接下来介绍第一种方法去操控gpio的状态(不建议使用) 方式1: #define GPIO62CON 0x0313e000 #define GPIO62DAT 0x0313e004 volatile unsigned int * gpio62con; volatile unsigned int * gpio62dat; //在调用流程中执行 gpio62con = ioremap(GPIO62CON,0x4); //物理地址映射成虚拟地址 if(NULL == gpio62con) { printk("

【NLP】GPT原理

一、GPT简介 1、含义 GPT是“Generative Pre-Training”的简称,是指的生成式的预训练。GPT采用两阶段过程,第一个阶段是利用语言模型进行预训练,第二阶段通过Fine-tuning的模式解决下游任务。下图展示了GPT的预训练过程。 2、GPT与ELMO区别与联系 (1)相同点:GPT和ELMO是类似的都是两阶段模型。 (2)不同点:首先,特征抽取器不是用的RNN,而是用的Transformer,它的特征抽取能力要强于RNN;其次,GPT的预训练虽然仍然是以语言模型作为目标任务,但是采用的是单向的语言模型,这对于完成阅读理解等任务存在缺陷。 二、GTP网络结构 1、第一阶段 下图讲GPT如何进行第一阶段的预训练,Embedding——>Transformer——>Text Production。 2、第二阶段 (1)首先,对于不同的下游任务来说,本来可以任意设计自己的网络结构,现在不行了,把任务的网络结构改造成和GPT的网络结构是一样的。 (2)其次,在做下游任务的时候,利用第一步预训练好的参数初始化GPT的网络结构,这样通过预训练学到的语言学知识就被引入到任务里了。 (3)再次,使用任务去训练这个网络,对网络参数进行Fine-tuning,使得这个网络更适合解决任务的问题。 三、GPT网络结构改造 对于NLP各种花样的不同任务,改造任务的网络结构使其靠近GPT的网络结构。 参考文献:网易云课堂NLP课程。