浅谈Android五大布局——LinearLayout、FrameLayout、AbsoulteLayout、RelativeLayout和TableLayout
项目里面需要对mongodb的性能进行测试,看了下网上很多做法都是使用YCSB进行测试,因此开始学习使用YCSB。
参考资料:
- YCSB github地址:https://github.com/brianfrankcooper/YCSB
- wiki: https://github.com/brianfrankcooper/YCSB/wiki
- 安装参考:https://github.com/brianfrankcooper/YCSB/tree/master/mongodb
- 之前的一些测试经验:http://www.sdpnosql.net/index.php/archives/3/ http://www.sdpnosql.net/index.php/archives/13/
1 安装
基于参考文档(https://github.com/brianfrankcooper/YCSB/tree/master/mongodb )安装java,mvn,ycsb
基本上安装了python(2.7.5版本以上),java(需要是jdk,而不是jre),mvn和ycsb之后就可以了
1.1 YCSB目录结构
安装好YCSB之后,查看YCSB目录如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
drwxr-xr-x. 3 root root 30 Oct 10 18:20 accumulodrwxr-xr-x. 3 root root 46 Oct 10 18:20 aerospikedrwxr-xr-x. 2 root root 17 Oct 13 05:03 bindrwxr-xr-x. 3 root root 56 Oct 10 18:20 binding-parent-rw-r--r--. 1 root root 877 Oct 10 18:20 BUILDdrwxr-xr-x. 3 root root 30 Oct 10 18:20 cassandra-rw-r--r--. 1 root root 7216 Oct 10 18:20 checkstyle.xmldrwxr-xr-x. 4 root root 60 Oct 13 03:18 coredrwxr-xr-x. 3 root root 46 Oct 10 18:20 couchbasedrwxr-xr-x. 3 root root 30 Oct 10 18:20 distributiondrwxr-xr-x. 4 root root 4096 Oct 10 18:20 docdrwxr-xr-x. 4 root root 54 Oct 10 18:20 dynamodbdrwxr-xr-x. 3 root root 46 Oct 10 18:20 elasticsearchdrwxr-xr-x. 3 root root 30 Oct 10 18:20 gemfiredrwxr-xr-x. 2 root root 36 Oct 10 18:20 hbase094drwxr-xr-x. 3 root root 46 Oct 10 18:20 hbase098drwxr-xr-x. 3 root root 46 Oct 10 18:20 hbase10drwxr-xr-x. 3 root root 43 Oct 10 18:20 hypertabledrwxr-xr-x. 3 root root 46 Oct 10 18:20 infinispandrwxr-xr-x. 3 root root 30 Oct 10 18:20 jdbc-rw-r--r--. 1 root root 8082 Oct 10 18:20 LICENSE.txtdrwxr-xr-x. 3 root root 43 Oct 10 18:20 mapkeeperdrwxr-xr-x. 4 root root 59 Oct 13 03:19 mongodbdrwxr-xr-x. 3 root root 43 Oct 10 18:20 nosqldb-rw-r--r--. 1 root root 479 Oct 10 18:20 NOTICE.txtdrwxr-xr-x. 3 root root 46 Oct 10 18:20 orientdb-rw-r--r--. 1 root root 5263 Oct 10 18:20 pom.xml-rw-r--r--. 1 root root 2033 Oct 10 18:20 README.mddrwxr-xr-x. 3 root root 46 Oct 10 18:20 redisdrwxr-xr-x. 3 root root 46 Oct 10 18:20 tarantooldrwxr-xr-x. 3 root root 30 Oct 10 18:20 voldemortdrwxr-xr-x. 2 root root 4096 Oct 13 01:09 workloads |
这里面有几个目录需要注意下:
bin:
- 目录下有个可执行的ycsb文件,是个python脚本,是用户操作的命令行接口。ycsb主逻辑是:解析命令行、设置java环境,加载java-libs,封装成可以执行的java命令,并执行
workloads:
- 目录下有各种workload的模板,可以基于workload模板进行个性化修改
core:
- 包含ycsb里各种核心实现,比如DB的虚拟类DB.java,各个db子类都要继承该类;还有比如workload抽象类,如果我们要自定义workload实现也需要继承该类
各种DB的目录:
- 比如mongo,redis等,里面包含了对应测试的源码等。
- 当ycsb mvn编译后,会在对应的目录下生成target文件,ycsb会加载对应target文件中的class类
2 使用
ycsb在执行的时候,分为两阶段:load阶段 和 transaction阶段
2.1 load阶段
该阶段主要用于构造测试数据,ycsb会基于参数设定,往db里面构造测试需要的数据,如:
|
1
|
./bin/ycsb load mongodb-async -s -P workloads/workloada > outputLoad.txt |
mongodb-async
在ycsb中,对于不同的db都有一些选项,比如mongo就有mongodb 和 mongodb-async。
默认的mongodb表示同步,即load和run使用同步的方式,ycsb会调用mongodb/src底下对应的MongodbClient实现对应的insert/update等操作。如果设置了mongodb-async,ycsb会调用mongodb/src底下对应的AsyncMongoDbClient.java实现
参数设置:
|
1
2
3
4
5
6
7
8
|
Options: -P file Specify workload file // workload文件 -cp path Additional Java classpath entries -jvm-args args Additional arguments to the JVM -p key=value Override workload property // 一些设置 -s Print status to stderr // 把状态达到stderr中 -target n Target ops/sec (default: unthrottled) // 每秒总共操作的次数 -threads n Number of client threads (default: 1) // 客户端线程数 |
参数解读:
-P workload文件
在ycsb的目录下有多种workload,参考:https://github.com/brianfrankcooper/YCSB/wiki/Core-Workloads,我们以workloada举例子
基础配置:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
recordcount=1000 # 总共的操作条数operationcount=1000 # 总共操作的次数workload=com.yahoo.ycsb.workloads.CoreWorkload=readallfields=true # 在读取的时候,是否需要读取所有字段readproportion=0.5 # 读取比例updateproportion=0.5 # update比例scanproportion=0insertproportion=0requestdistribution=zipfian |
workloada的负载比较中,read和update类比例为1:1,里面一些设置参数如上,如果我们再设置mongo的时候,还需要再workload中增加对应的mongo配置,如下:
|
1
2
3
|
mongodb.url=mongodb://192.168.137.10:34001/ycsb? # mongodb对应的uri等mongodb.database=ycsb # 对应的dbmongodb.writeConcern=normal # 写级别 |
-p选项
-p用于设置一些对应的参数,如果workload中的参数,也可以以-p的方式放在命令行中设置
-s
-s是表示,在运行中,把一些状态打印到stderr中,一般status信息,用于表示在运行中的一些中间状态(比如当前处理了多少请求,还有多少请求等)
-target n
表示1s中总共的操作次数(各个线程加起来的),如果性能不满足,比如最高性能只有100,你设置了1000,那么ycsb会尽量往这个数目去靠近。默认是不做限制
-thread 线程数
设置ycsb client的并发测试线程数,默认是1,单线程,所以再测试的时候,一定要设置这个选项
2.2 transcation阶段
在2.1load数据结束之后,ycsb就可以进行测试了,也就是transaction阶段。在transaction阶段,会基于workload中的比例设置,和线程参数设置进行db的压测。具体参数如上
3 一些自定义操作
由于这次在使用ycsb测试mongodb中主要是为了测试mongodb3.0的性能,同时需要和2.6.9进行对比。而3.0性能写性能大幅度提升是因为锁力度从db锁升级到collection锁。而默认的insert、update操作都是对于同一个collection操作(usertable),没法体现这个优势。
因此我们需要修改对应的insert、update和read接口实现一次性写多个db。修改如下:
修改mongodb底下的MongoDbClient和AsyncMongoDbClient中关于insert、update、read函数实现
如下:
原来的实现:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public final int update(final String table, final String key, final HashMap<String, ByteIterator> values) { try { final MongoCollection collection = database.getCollection(table); final DocumentBuilder query = BuilderFactory.start().add("_id", key); final DocumentBuilder update = BuilderFactory.start(); final DocumentBuilder fieldsToSet = update.push("$set"); for (final Map.Entry<String, ByteIterator> entry : values.entrySet()) { fieldsToSet.add(entry.getKey(), entry.getValue().toArray()); } final long res = collection.update(query, update, false, false, writeConcern); return res == 1 ? 0 : 1; } catch (final Exception e) { System.err.println(e.toString()); return 1; }} |
修改后:
|
1
|
public final int update(final String table, final String key, final HashMap<String, ByteIterator> values) {<br> // 对原来的update函数做修改,在每次update时都多做几次操作<br> int ret = updateOneTable(table, key, values);<br> if (ret != 0) {<br> return ret;<br> }<br> <br> for (int i = 0; i < TABLE_NUM; ++i) {<br> String tableName = table + String.valueOf(i);<br> ret = updateOneTable(tableName, key, values);<br> if (ret != 0) {<br> return ret;<br> }<br> } <br> <br> return 0; <br>} <br><br>public final int updateOneTable(final String table, final String key, final HashMap<String, ByteIterator> values) {<br> try { <br> final MongoCollection collection = database.getCollection(table);<br> final DocumentBuilder query = BuilderFactory.start().add("_id", key);<br> final DocumentBuilder update = BuilderFactory.start();<br> final DocumentBuilder fieldsToSet = update.push("$set");<br> <br> for (final Map.Entry<String, ByteIterator> entry : values.entrySet()) { <br> fieldsToSet.add(entry.getKey(), entry.getValue().toArray()); <br> }<br> <br> final long res = collection.update(query, update, false, false, writeConcern);<br> return res == 1 ? 0 : 1; <br> } catch (final Exception e) {<br> System.err.println(e.toString()); return 1; <br> } <br>} |
其中TABLE_NUM可以根据实际需求进行设置(实际中,我们设置了该值为4,表示一次写5个table)
浅谈Android五大布局——LinearLayout、FrameLayout、AbsoulteLayout、RelativeLayout和TableLayout的更多相关文章
- [转]浅谈Android五大布局(二)——RelativeLayout和TableLayout
在浅谈Android五大布局(一)中已经描述了LinearLayout(线性布局).FrameLayout(单帧布局)和AbsoulteLayout(绝对布局)三种布局结构,剩下的两种布局Relati ...
- [转]浅谈Android五大布局(一)——LinearLayout、FrameLayout和AbsoulteLayout
Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.Android的五大布局分别是LinearLay ...
- 浅谈Android五大布局
Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.Android的五大布局分别是LinearLay ...
- 浅谈Android五大布局(一)——LinearLayout、FrameLayout和AbsoulteLayout
Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.Android的五大布局分别是LinearLay ...
- Android 五大布局
Android 五大布局: FrameLayout(框架布局),LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),Table ...
- Android 五大布局(LinearLayout、FrameLayout、AbsoulteLayout、RelativeLayout、TableLayout )
前言 欢迎大家我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net ...
- Android五大布局详解——LinearLayout(线性布局)
Android五大布局 本篇开始介绍Android的五大布局的知识,一个丰富的界面显示总是要有众多的控件来组成的,那么怎样才能让这些控件能够按你的想法进行摆放,从而自定义你所想要的用户界面呢?这就牵涉 ...
- Android笔记——Android五大布局
一.五大布局 Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.Android的五大布局分别是Li ...
- 安卓开发_浅谈Android动画(四)
Property动画 概念:属性动画,即通过改变对象属性的动画. 特点:属性动画真正改变了一个UI控件,包括其事件触发焦点的位置 一.重要的动画类及属性值: 1. ValueAnimator 基本属 ...
随机推荐
- iOS:UIAlertController和UIAlertAction的详解
提示框控制器:UIAlertController 提示框按钮:UIAlertAction 功能:用来提示信息,并给出一些可以进行选择的按钮来处理相应的要求. 注意:在Xcode的iOS8 SD ...
- 解决COS、FileUpload上传文件时中文文件名乱码问题
方法: MultipartParser mp = new MultipartParser(request, 10*1024*1024); mp.setEncoding("GBK") ...
- sublime3运行lua
{ "cmd": ["/usr/local/bin/lua", "$file"], "file_regex": &quo ...
- hive-0.12升级成hive 0.13.1
安装了0.12之后,听说0.13.1有许多新的特性,包括永久函数,所以想更新成0.13版的(元数据放在mysql中) 2014年8月5日实验成功 hive0.13.1的新特性 新特性详见 http:/ ...
- QT 实现彩色图亮度均衡,RGB和HSI空间互相转换
从昨天折腾到今天.再折腾下去我都要上主楼了 大致和灰度图均衡是一样的,主要是不能像平滑什么的直接对R,G,B三个分量进行.这样出来的图像时没法看的.因此我们要对亮度进行均衡.而HSI彩色空间中的分量 ...
- 石阶 VS 石像
山庙有尊雕刻精美的佛像,前来拜佛的人络绎不绝. 铺在山路上的石阶开始抱怨:“大家同是石头,凭什么我被人蹬来踩去,你却被人供在殿堂?” 佛像笑了笑:“当年你只挨六刀,做了一方石阶,而我经历了千刀万凿之后 ...
- Python得到两个时间段的每一天的列表
date_list = [] begin_date = datetime.datetime.strptime(begin_date, "%Y-%m-%d") end_date = ...
- django 外键 ,django __
data sqlite> select * from author; id name age 1 jim 12 2 tom 11 sqlite> select * from book; i ...
- 深入浅出:Linux设备驱动之字符设备驱
一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用驱动程序: 字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面向流 ...
- AOJ-2249 Road Construction(最短路)
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=45523 有一个国王想在首都与各个城市之间修建公路,但是他的预算太高,所以必须 ...