Address
304 North Cardinal St.
Dorchester Center, MA 02124

Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM

Category 经验

463.【数据库】Star Schema Benchmark 标准测试集优化(二)

这是Star Schema Benchmark 标准测试集优化的第二篇,前一篇提到了优化表结构。 表结构优化完之后,我们分析了下表数据, 这几个表,除了lineorder是根据factor成倍增长,其它的表记录数增长应该是缓慢的,对吧,有的表甚至没有随着factor增长,对吧? 上面是架构师问让我调研的,我查了下,customer、supplier、lineorder三张表是成倍增长的(1:10:100)。dates表固定不变(1:1:1),part表增长缓慢(1:4:7);最大表(也即事实表) lineorder 除外,成倍增长的 supplier 和 lineorder 表虽然是成倍增长的,但基数也是不大,1000G 大小的数据集,customer 表才 3000万数据(lineorder是60亿数据)。 调查结果表明该数据集确实符合 Star Schema 的特点:星型模式将业务流程数据分为事实数据和维度数据,事实数据包含关于业务的可测量量化数据,维度是与事实数据相关的描述性属性。事实数据的例子包括销售价格、销售数量、时间、距离、速度和重量测量。相关的维度属性示例包括产品型号、产品颜色、产品大小、地理位置和销售人员名称。 oracle数据库最好也安装一个,用它来比较查询结果;用它作为标准来验证查询结果,不能用别的数据库,因为我们不知道他们有没有bug,Oracle是绝对可信的。 这一步,我导入了1G,10G大小的数据到咱们的数据库,还有Oracle数据库。分别执行了13 条标准SQL,经过检验得知:咱们数据库得查询结果和 Oracle 数据库查询结果完全一致。 PS: 结合咱们数据库最新的多维分析专利技术,咱们除了多维数据这块的第一个版,使用 30G 大小的数据集,测得所有SQL的查询时间总计是 122s,100G大小的数据之前是 2800s,已经出现了巨额的提升——这就是发明专利加持的力量 相关阅读: 443.【数据库】Star Schema Benchmark 标准测试集优化(一)

Gradle技术之二 Groovy对文件的操作

Groovy对文件的操作 对文件的遍历 假设文件的原始内容为: hello,world 这里是北京 andorid and ios are good system 第一种方法:使用 eachLine() new 一个File def file = new File(filepath) groovy对文件的遍历 file.eachLine { //打印每一行内容 line -> println line } //输出 hello,world 这里是北京 andorid and ios are good system…

Gradle技术之一 Groovy语法精讲

gradle脚本是基于groovy语言开发的,想要学好gradle必须先要对groovy有一个基本的认识 1. Groovy特点 groovy是一种DSL语言,所谓的DSL语言,就是专门针对某一特定领域的语言,专精而不专广 是一种基于JVM的开发语言,也是编译成class字节码文件 结合和Python,Ruby,PHP等语言的特性,写脚本非常强大 Groovy可以与Java完美结合,而且可以使用Java所有的类库 语法上支持动态类型,闭包等新语言的特性 支持面向过程和面向对象编程 2. Groovy语法精讲 1 变量的类型和定义 -变量的类型分两种 基本类型:和java的基本类型一样,int,long,double,float,boolean,byte,String等 注意Groovy中,这些基本类型实际上都会被系统装箱为对应的对象类型,比如int就会被自动装箱为Integer 对象类型:和Java的一样 – 变量的定义 强类型定义:如 int a=10 ,指定变量的类型 弱类型定义:如 def b = 5,系统根据后面的值自动判断b是什么类型 – Groovy语法小点 语句后面可以不带分号,也可以带分号,如定义一个变量 int a = 10 输出一句话,直接println就行了,圆括号也可以省略,如 println "hello,world" 定义变量或者函数可以使用关键字def ,也可以按照Java的语法格式定义,如def…

Gradle技术之四 – Gradle的Task详解

1 Gradle的Task详解 1 Task定义和配置 2 Task的执行 3 Task的依赖和执行顺序 4 Task类型 5 Task结合gradle的生命周期 6 Task实战 1.1 Task定义和配置 1.1.1 查看所有的task ./gradlew tasks 输出 > Task :tasks ———————————————————— All tasks runnable from root project ———————————————————— Android tasks ————- androidDependencies – Displays the Android…

Android-插件化探索(一)

前言 由于近期项目中要用到插件,所以特地去翻找资料学习了一番,现在在这里分享我所学到的东西给大家,有什么错误的希望能给我指出来,文章有点长,希望大家能认真读完。 近些年来,插件化可谓是特别的火热,就拿支付宝美团等软件来说,都是使用这个技术来支撑他们的产品。但是什么是插件化呢,插件化到底有什么好处呢? 插件化也就是运行的APP(宿主APP)去加载插件APP(没有安装的APP),这就是所谓的插件化开发。 插件化到底运行在什么场景下呢?其实插件化使用的场景有很多,这里就比如下图的支付宝或者美团等APP,点击某个相应的item,就会跳转到相应的页面当中,其实这个页面是插件apk中的页面,但是它到底怎么做到的呢?怎么做到不安装apk而加载插件中的页面呢? 下面我们就来探索探索不用安装插件apk是怎么去加载里面的Activity、Service、BroadCastReceiver等这些组件的。本篇文章所提的是占位式(插桩式)插件化。 由于插件apk是没有安装的,也就是插件apk没有组件的一些环境,比如context上下文对象之类的,如果要用到这些环境就必须依赖宿主的环境运行。所以我们就要宿主跟插件之间定义一个标准。用来传递宿主中的环境给插件。 加载插件中的Activity 第一步: 首先我们先定义一个标准,让插件实现我们的标准来传递宿主APP的环境,下图是定义Activity类的标准,下面我们从加载插件中的Activity开始讲起。 首先我们要在插件中实现刚才我们定义的标准,由于插件都需要宿主APP的环境,所以我们就定义一个基类来实现该标准,然后让我们的插件的Activity来继承该基类,该Activity就具有了宿主的环境了。如图所示。 第二步: build工程,得到插件apk,命名为 plugin.apk 并把它放到我们的sd目录下。让宿主APP来加载插件。 首先我们要加载插件apk中的类,就需要用到DexClassLoader这个类,下面是用该类来加载插件apk的方法。 File file = new File(path); File pluginDir = context.getDir("plugin", Context.MODE_PRIVATE); //加载插件的class dexClassLoader = new DexClassLoader(path, pluginDir.getAbsolutePath(), null, context.getClassLoader()); 参数说明: path:插件所存放的目录(plugin.apk存放的目录) pluginDir.getAbsolutePath():插件apk解析后dex文件所存放的路径 null:该参数是so库存放的路径,由于插件里没有so库,所以为null。 context.getClassLoader():类加载器 获取到了DexClassLoader的对象,我们就可以拿到插件中的类了,接下来我们要获取插件apk中的资源对象,也就是…

android 面试题总结

一、多线程 Join() 线程加入,执行此方法的线程优先使用cpu Yeild() 线程释放资源使所有线程能有相等的机会使用cpu Sleep() 相当于让线程睡眠,交出CPU,让CPU去执行其他的任务(不会释放锁)。 Wait()方法会让线程进入阻塞状态,并且会释放线程占有的锁,并交出CPU执行权限。wait是要释放对象锁,进入等待池。既然是释放对象锁,那么肯定是先要获得锁。所以wait必须要写在synchronized代码块中,否则会报异常。 notify方法,也需要写在synchronized代码块中,调用对象的这两个方法也需要先获得该对象的锁.notify,notifyAll, 唤醒等待该对象同步锁的线程,并放入该对象的锁池中.对象的锁池中线程可以去竞争得到对象锁,然后开始执行.如果是通过notify来唤起的线程,那先进入wait的线程会先被唤起来,并非随机唤醒;如果是通过nootifyAll唤起的线程,默认情况是最后进入的会先被唤起来,即LIFO的策略;notify()或者notifyAll()调用时并不会真正释放对象锁, 必须等到synchronized方法或者语法块执行完才真正释放锁. Interrupt() 处于阻塞状态(wait sleep)的线程调用时会抛出异常(InterruptedException ) 守护线程 不会去实现系统的主要功能,主要用于监控、抓取系统资源明细和运行状态 等操作,如垃圾回收线程setDeamon(true) 在start方法前调用,守护线程中不要做 二、Java中的String,StringBuilder,StringBuffer三者的区别 String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下,便于大家观看,也便于加深自己学习过程中对这些知识点的记忆,如果哪里有误,恳请指正。 这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String String最慢的原因:String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。以下面一段代码为例: 1 String str=”abc”;2 System.out.println(str);3 str=str+”de”;4 System.out.println(str); 如果运行这段代码会发现先输出“abc”,然后又输出“abcde”,好像是str这个对象被更改了,其实,这只是一种假象罢了,JVM对于这几行代码是这样处理的,首先创建一个String对象str,并把“abc”赋值给str,然后在第三行中,其实JVM又创建了一个新的对象也名为str,然后再把原来的str的值和“de”加起来再赋值给新的str,而原来的str就会被JVM的垃圾回收机制(GC)给回收掉了,所以,str实际上并没有被更改,也就是前面说的String对象一旦创建之后就不可更改了。所以,Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。 而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。 另外,有时候我们会这样对字符串进行赋值 1 String str=”abc”+”de”;2 StringBuilder stringBuilder=new…

中级Android面试总结之Android篇

主要收集在面试过程中普遍问到的基础知识(面试收集 主要来自于bilibili 嵩恒 蚂蚁金服等互联网公司)由于总结的东西很多很乱 启动 启动模式 standard 标准模式 singleTop 栈顶复用模式 (例如:推送点击消息界面) singleTask 栈内复用模式 (例如:首页) singleInstance 单例模式 (单独位于一个任务栈中,例如:拨打电话界面) 启动流程 app启动交互逻辑   在Android 层 第一步就是 fork Zygote 进程(1. 创建服务端Socket,为后续创建进程通信做准备 2. 加载虚拟机 3.fork了System Server进程,负责启动和管理Java Framework层,包括ActivityManagerService,PackageManagerService,WindowManagerService、binder线程池等 )。    wanandroid 有一个经典的问题 : Activity启动流程中,大部分都是用Binder通讯,为啥跟Zygote通信的时候要用socket呢? ServiceManager (初始化binder线程池的地方)不能保证在zygote起来的时候已经初始化好,所以无法使用Binder。 Binder工作依赖于多线程,但是fork的时候是不允许存在多线程的,多线程情况下进程fork容易造成死锁,所以就不用Binder了。…

Android面试回忆录:Serializable 都这么牛逼了,还要Parcelable有何用?

话说最近公司在招聘一批至少 5 年开发经验的 Android 开发工程师,我也是忙开了花,激动得不行呀。虽说我面试过的技术开发至少 50 人以上,但这还是第一次开始面试 Android,此时犹如大姑娘上轿,还真是头一回呀! 所以非常非常非常用心地准备了良久,然后满怀激动地开始了我的 Android 面试官角色。 无奈,面试后的感觉,均是开发效率听起来很牛逼,第三方 API 用起来非常顺手,但问到基础,就拿我面试系列的题去问,没一个答得上的,甚至是循循善诱,都没法好好回答。 面试场景 Android 开发中对两个 Activity 之前传递数据,应该很熟悉吧? 嗯,当然没问题。一般采用 Intent.putXXX() 就可以实现各种轻量级数据的传递。 那对于自定义的 Object 呢? 直接使用 Bundle 的 putSerializable() 即可。需要把对象实现 Serializable 接口,最后使用 Intent.putExtras(Bundle) 把数据放进 Intent 即可。 除了这种方式,还有其它方式吗?和这种方式有什么区别呢? 我知道还有 Bundle.putParcelable() ,不过我们平时基本都只用…

谷歌开源Fuchsia OS,对标鸿蒙取代 Android?

谷歌宣布开放其操作系统 Fuchsia 的源代码,历经 4 年的长期开发,Fuchsia 终于向公众开放了。这也是谷歌首次尝试开发全新的内核和通用操作系统。 除了宣布开源该项目,谷歌还发布了 Fuchsia 的技术路线图,它的独特之处在于,它不是基于 Linux 内核,而是使用了 Zircon 的微内核。 自从 2016 年 8 月 Fuchsia 首次在 GitHub 亮相以来,谷歌很少公布有关该计划的信息。这次开源,谷歌选择了自家的 googlesource,并在一年前就删除了 GitHub 上的镜像。 一旦公司感到自己已经建立了一个稳定的基础,就可以开始向外部贡献者开放其开源项目。现在,谷歌似乎已经准备好更多的谈论 Fuchsia。 尽管谷歌强调 Fuchsia 尚未准备好进行常规产品开发或作为开发目标,但仍表示,“作为开放源代码的努力,我们欢迎所有人的高质量,经过测试的贡献。” Fuchsia支持有限的一组基于 x64 的硬件,开发者也可以使用 Fuchsia 的仿真器对其进行测试。 谷歌称,Fuchsia 被设计为安全、可更新,具有包容性和实用性的生产级操作系统。 除了新的邮件列表,谷歌还发布了 Fuchsia 的技术路线图主要侧重于低级操作系统,例如“独立于驱动程序更新内核的驱动程序框架”和“Fuchsia…

解决GTA5单机游戏闪退的终极指南

在这个快节奏的生活中,电子游戏为我们提供了一个逃离现实、享受乐趣的方式。然而,正当我沉浸在《GTA5》的世界中时,闪退问题却常常如影随形,这份美好的体验便被打断了。那么,如何解决GTA5单机游戏闪退的问题呢?今天,我就来分享一些实用的方法和经验。 首先,解决闪退的原因有很多,通常可以归结为以下几种:游戏文件损坏、系统兼容性问题、驱动程序过时、内存不足或者MOD冲突等。逐步排查这些问题,是解决闪退的第一步。 一、验证游戏文件完整性 游戏文件可能因为更新或其他原因受到损坏。我们可以通过Steam等平台自带的功能来验证文件完整性,步骤如下: 打开Steam客户端,进入“库”页面。 右键点击《GTA5》,选择“属性”。 在“本地文件”选项卡中,点击“验证游戏文件的完整性”。 完成后,Steam会自动检测并修复任何损坏的文件,这样就能确保你在玩游戏时不会因为文件问题而闪退。 二、更新显卡驱动程序 如果你的显卡驱动程序过旧,它可能无法支持游戏的最新更新。通过更新驱动程序,可以优化游戏性能,并防止闪退。你可以访问显卡制造商的官网,如NVIDIA或AMD,下载最新的驱动程序并进行安装。更新完成后,建议重启计算机,以确保新驱动生效。 三、调整游戏设置 有时候,游戏的设置过高会导致电脑性能不堪重负,从而闪退。尝试以下方法调整设置: 降低图形设置,例如分辨率、抗锯齿、阴影等。 关闭不必要的背景程序,释放内存资源。 尝试以管理员身份运行游戏,有时权限不足也会导致闪退。 这些简单的调整往往能有效地改善游戏体验。 四、检查MOD和插件 对于喜欢使用MOD的玩家来说,某些MOD可能与游戏不兼容,导致闪退。尝试以下措施: 禁用所有MOD,查看是否仍然出现闪退。 逐个启用MOD,找到造成闪退的具体MOD,并进行删除或更新。 保持游戏的“清洁状态”可以使闪退现象显著减少。 五、清理系统和释放内存 有时候系统资源不足会导致游戏无法正常运行。定期清理电脑上的无用文件,释放内存和硬盘空间也很重要。可以使用类似CCleaner的工具,自动清理临时文件和冗余注册表信息。 总结 闪退固然让人沮丧,但通过以上几种方法,我们能有效排查问题,恢复游戏的畅快体验。如果尝试了上述方法后仍然无法解决,可能就需要考虑重装游戏或寻求专业的技术支持了。希望以上建议对你能够有所帮助,让我们在洛圣都的世界里尽情驰骋吧!