Mryqu's Notes


  • 首页

  • 搜索
close

尝试Protocol Buffers支持的各种数据类型

时间: 2013-09-22   |   分类: Service+JavaEE     |   阅读: 168 字 ~1分钟
Protocol Buffers(即protobuf)是Google开源的序列化库,是一种轻便高效的结构化数据存储格式,可以用于结构化数据序列化/反序列化。它很适合做数据存储或RPC的数据交换格式,常用作通信协议、数据存储等领域。 相比于常见的XML格式,ProtocolBuffers官方网站这样描述它的优点: 平台无关、语言无关; 高性能; 体积小; 使用简单; 兼容性好。 现在尝试一下Protocol Buffers支持的各种数据类型。 test.proto package com.yqu.proto; option java_package = "com.yqu.proto"; option java_outer_classname="TestProtos"; message Test { required double doubleVar = 1; required float floatVar = 2; required int32 int32Var = 3; required int64 int64Var = 4; required uint32 uint32Var = 5; required uint64 uint64Var = 6; required sint32 sint32Var = 7; required sint64 sint64Var = 8; required fixed32 fixed32Var = 9; required fixed64 fixed64Var = 10; required sfixed32 sfixed32Var = 11; required sfixed64 sfixed64Var = 12; required bool booleanVar = 13; required string stringVar = 14; required bytes bytesVar = 15; enum Suit { SPADES = 0; HEARTS = 1; DIAMONDS = 2; CLUBS = 3; } required Suit enumVar = 16 [default = HEARTS]; repeated int32 int32ArrayVar = 17; repeated uint32 uint32ArrayVar = 18 [packed=true]; repeated string stringArrayVar = 19; message MsgVar { required string url = 1; optional string title = 2; } repeated MsgVar msgVar = 20; } 使用Google提供的Protocol Buffers编译器生成Java语言:
阅读全文 »

[Git] 获取两个版本间所有变更的文件列表

时间: 2013-09-22   |   分类: Tool   Git     |   阅读: 33 字 ~1分钟
git diff commit-SHA1 commit-SHA2 –name-status返回变更的文件列表,每个文件前带有变更状态: ’ ’ = unmodified M = modified A = added D = deleted R = renamed C = copied U = updated but unmergedgit diff commit-SHA1 commit-SHA2 –stat返回变更的文件列表,每个文件后面带有变更统计信息。

[Hadoop] 安装protobuf

时间: 2013-09-21   |   分类: BigData     |   阅读: 21 字 ~1分钟
Protocol Buffers (即protobuf)是Google的语言无关、平台无关、结构数据序列化的可扩展机制。 在Window平台编译Hadoop需要protobuf,下载所需的protoc-2.5.0-win32.zip,将protoc.exe复制到某目录,加入PATH变量即可。 参考 Hadoop WIKI: How to Contribute to Hadoop Hadoop WIKI: ProtocolBuffers protobuf releases GitHub: google/protobuf protobuf documents

Python安装oauth2库

时间: 2013-09-21   |   分类: Python     |   阅读: 4 字 ~1分钟
玩一下用python和twitterAPI访问Twitter数据,首先需要安装oauth2库以获得身份验证。pip是PythonPackaging Authority(PyPA)推荐用于安装Python包的工具。首先下载get-pip.py,然后通过下面的命令安装python get-pip.py pip.exe会被安装到\script\目录下。之后就可以用pip安装oauth2包了.

SSH keys for Git System

时间: 2013-09-18   |   分类: Tool   Git     |   阅读: 375 字 ~2分钟
SSH keys An SSH key allows you to establish a secure connection betweenyour computer and Git system such as GitHub, GitLab. Before generating an SSH key, check if your system already hasone by running cat ~/.ssh/id_rsa.pub . If you see a long string startingwith ssh-rsa or ssh-dsa ,you can skip the ssh-keygen step. To generate a new SSH key, just open your terminal and use codebelow. The ssh-keygen command prompts you for a location andfilename to store the key pair and for a password.
阅读全文 »

尝试Apache Avro支持的各种数据类型

时间: 2013-09-18   |   分类: BigData     |   阅读: 1689 字 ~8分钟
Apache Avro是一个独立与编程语言的数据序列化系统,该项目由Doug Cutting(Hadoop之父)牵头创建的。它可以提供: 丰富的数据结构类型 快速可压缩的二进制数据形式 存储持久数据的文件容器 远程过程调用(RPC) 同动态语言的简单集成。读写数据文件和使用RPC协议都不需要生成代码,而代码生成作为一种可选的优化只值得在静态类型语言中实现。 今天尝试一下Apache Avro支持的各种数据类型。 test.avsc {"namespace": "com.yqu.avro", "type": "record", "name": "Test", "fields": [ {"name": "stringVar", "type": "string"}, {"name": "bytesVar", "type": ["bytes", "null"]}, {"name": "booleanVar", "type": "boolean"}, {"name": "intVar", "type": "int", "order":"descending"}, {"name": "longVar", "type": ["long", "null"], "order":"ascending"}, {"name": "floatVar", "type": "float"}, {"name": "doubleVar", "type": "double"}, {"name": "enumVar", "type": {"type": "enum", "name": "Suit", "symbols" : ["SPADES", "HEARTS", "DIAMONDS", "CLUBS"]}}, {"name": "strArrayVar", "type": {"type": "array", "items": "string"}}, {"name": "intArrayVar", "type": {"type": "array", "items": "int"}}, {"name": "mapVar", "type": {"type": "map", "values": "long"}}, {"name": "fixedVar", "type": {"type": "fixed", "size": 16, "name": "md5"}} ] } 使用下列命令将schema编译成代码
阅读全文 »

[算法] Trie(数字树、字典树、前缀树)

时间: 2013-09-18   |   分类: Algorithm.DataStruct     |   阅读: 439 字 ~3分钟
术语trie取自retrieval,也被称为数字树、字典树或前缀树,是一种有序树数据结构,哈希树的变种。 与二叉查找树不同,树中节点不存储与节点关联的键,而是通过树中的位置定义键。一个节点的所有子孙节点拥有与该节点相同的字符串前缀,根节点与空字符串相关联。并不是每个节点都与值关联,仅叶节点和部分内部节点与值关联。 含有键为"A"、“to”、“tea”、“ted”、“ten”、“i”、“in"和"inn"的trie示例。 trie 中的键通常是字符串,但也可以是其它的结构。trie的算法可以很容易地修改为处理其它结构的有序序列,比如一串数字或者形状的排列。比如,bitwise trie中的键是一串位元,可以用于表示整数或者内存地址。 性质 根节点不包含字符,除根节点外每一个节点都只包含一个字符; 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串; 每个节点的所有子节点包含的字符都不相同。 应用 替代其他数据结构 trie较二叉查找树有很多优点,trie可用于替代哈希表,优点如下: trie数据查找与不完美哈希表(链表实现,完美哈希表为数组实现)在最差情况下更快:对于trie,最差情况为O(m),m为查找字符串的长度;对于不完美哈希表,会有键冲突(不同键哈希相同),最差情况为O(N),N为全部字符产集合个数。典型情况下是O(m)用于哈希计算、O(1)用于数据查找。 trie中不同键没有冲突 trie的桶与哈希表用于存储键冲突的桶类似,仅在单个键与多个值关联时需要 当更多的键加入trie,无需提供哈希方法或改变哈希方法 tire通过键为条目提供了字母顺序Trie也有一些缺点: trie数据查找在某些情况下(尤其当数据直接从磁盘或随机访问时间远远高于主内存的辅助存储设备时)比哈希表慢 当键为某些类型时(例如浮点数)之类的键,前缀链很长且前缀不是特别有意义。然而bitwisetrie能够处理标注IEEE单精度和双精度浮点数。 一些trie会比哈希表消耗更多空间:对于trie,每个字符串的每个字符都可能需要分配内存;对于大多数哈希表,为整个条目分配一块内存。 字典表示 典型应用是预测文本排序(常被搜索引擎系统用于文本词频统计)、字典自动完成、字符串近似匹配(拼写检查、断字)。 实现 trie基本操作有:查找、插入和删除。 trie数据查找的方法为 从根结点开始一次搜索; 取得要查找关键词的第一个字母,并根据该字母选择对应的子树并转到该子树继续进行检索; 在相应的子树上,取得要查找关键词的第二个字母,并进一步选择对应的子树进行检索。 迭代过程…… 在某个结点处,关键词的所有字母已被取出,则读取附在该结点上的信息,即完成查找。 public class Trie { private Node root = new Node(""); public Trie() {} public Trie(List argInitialWords) { for (String word:argInitialWords) { addWord(word); } } public void addWord(String argWord) { char argChars[] = argWord.toCharArray(); Node currentNode = root; for (int i = 0; i < argChars.
阅读全文 »

JDK7中的双端队列Deque实现

时间: 2013-08-08   |   分类: Java     |   阅读: 121 字 ~1分钟
双端队列Deque(全名double-endedqueue)是一种数据结构,可在双端队列的两端插入、获取或删除元素。队列和栈可以认为是双端队列的特列。 Deque常用的方法: First Element (Head)Last Element (Tail)Throws exceptionSpecial valueThrows exceptionSpecial valueInsertaddFirst(e)offerFirst(e)addLast(e)offerLast(e)RemoveremoveFirst()pollFirst()removeLast()pollLast()ExaminegetFirst()peekFirst()getLast()peekLast() Deque扩展了Queue接口,当Deque用作FIFO队列时,元素从双端队列队尾加入,从队首移出。从Queue接口继承的方法等同于Deque如下方法: Queue MethodEquivalent Deque Methodadd(e)addLast(e)offer(e)offerLast(e)remove()removeFirst()poll()pollFirst()element()getFirst()peek()peekFirst() Deques也可作为LIFO栈。该接口应该优先于遗留的Stack类使用。当双端队列用作栈时,元素从队首入栈和出栈。Stack方法等同与Deque如下方法: Stack MethodEquivalent Deque Methodpush(e)addFirst(e)pop()removeFirst()peek()peekFirst() 注意:当deque用作队列或堆栈时,peek方法也可正常工作,都从deque起始位置移除元素。 JDK6加入的Deque实现 LinkedList: 一个基于链接节点实现的无界双端队列。允许null元素。 ArrayDeque: 一个基于可变长度数组实现的无界双端队列。不允许null元素。 就效率而言,ArrayDeque在两端添加或删除元素时比LinkedList更高效。ArrayDeque用作栈时比Stack更快,用作队列时比LinkedList更快。 LinkedList实现比ArrayDeque实现更复杂,耗费更多的内存。当遍历双端列表时删除当前元素,LinkedList比ArrayDeque更高效。 继承BlockingQueue的BlockingDeque接口及其实现LinkedBlockingDeque:一个基于链接节点实现的可选有界双端队列。如果LinkedBlockingDeque在构造时没有设定容量大小,添加元素永远不会有阻塞队列的等待(至少在其中有Integer.MAX_VALUE元素之前不会)。 LinkedBlockingDeque实现采用一个独占锁,所有对队列的操作都进行了锁保护,因而很好的支持双向阻塞的特性。缺点是由于独占锁,所以不能同时进行两个操作,这样性能上就大打折扣。 LinkedBlockingDeque实现具有显对低的开销及相对低的可扩展性。如果仅需要FIFO队列功能,最好使用LinkedBlockingQueue,LinkedBlockingQueue具有相同的开销但是有更好的伸缩性(例如很多线程竞争时保持更好的性能)。 深入浅出 Java Concurrency (24): 并发容器 part 9 双向队列集合 Deque 深入浅出 Java Concurrency (25): 并发容器 part 10 双向并发阻塞队列 BlockingDeque JDK7加入的Deque实现 ConcurrentLinkedDeque:一个基于链接节点实现的无界无阻塞双端队列。收集关于队列大小的信息会很慢,需要遍历队列。 ConcurrentLinkedDeque具有跟LinkedBlockingDeque相反的表现:相对高的开销及很好的可伸缩性(使用CAS操作进行非堵塞操作,减少了锁的开销,避免序列化瓶颈)。 [concurrency-interest] BlockingDeque and revised Deque Deque应用:回文(Palindrome)检查 Deque的应用不是很多,很容易使用双端队列解决的一个有趣问题是经典的回文问题。回文是正着读和倒着读都一样的字符串,例如radar、toot和madam。 回文检查方案是采用Deque存储字符串的字符,将字符串中的字符从左到右插入Deque尾部,则deque头部将持有字符串的首字符,deque尾部将持有字符串的末字符。然后从Deque两端移出字符进行比较,直到Deque内字符数为0或1为止。 public class PalindromeChecker { public static boolean palchecker(String str) { if(str==null || str.isEmpty()) return false; ArrayDeque aDeque = new ArrayDeque (str.
阅读全文 »

序列化压缩实现及对比测试

时间: 2013-08-08   |   分类: Java     |   阅读: 869 字 ~5分钟
网上介绍序列化压缩的用gzip比较多。写个测试代码,测试一下四种序列化方式: 无压缩 zlib压缩 gzip压缩 zip压缩 测例结果显示压缩效果:gzip压缩 > zlib压缩 > zip压缩> 无压缩 测例结果显示压缩速度:zlib压缩> gzip压缩> zip压缩 = 无压缩 确实用gzip性价比比较高! ### zlib介绍 zlib是一个开源库,提供了在内存中压缩和解压的函数。zlib它的设计目标是处理单纯的数据(而不管数据的来源是什么)。 ### gzip介绍 gzip是UNIX下的一种数据格式(.tar.gz)。gzip是在zlib之上,包了一层,在头和尾添加了一些额外的信息。 gzip是一种文件压缩工具(或该压缩工具产生的压缩文件格式),它的设计目标是处理单个的文件。gzip在压缩文件中的数据时使用的就是zlib。为了保存与文件属性有关的信息,gzip需要在压缩文件(.gz)中保存更多的头信息内容,而zlib不用考虑这一点。但gzip只适用于单个文件,所以我们在UNIX/Linux上经常看到的压缩包后缀都是.tar.gz或*.tgz,也就是先用tar把多个文件打包成单个文件,再用gzip压缩的结果。 ### zip介绍 zip只是一种数据结构,跟rar同级别的。zip是适用于压缩多个文件的格式(相应的工具有PkZip和WinZip等),因此,zip文件还要进一步包含文件目录结构的信息,比gzip的头信息更多。但需要注意,zip格式可采用多种压缩算法,我们常见的zip文件大多不是用zlib的算法压缩的,其压缩数据的格式与gzip大不一样。 Java SDK提供了对上述三种压缩技术的支持:Inflater类和Deflater类直接用zlib库对数据压缩/解压缩,GZIPInputStream类和GZIPOutputStream类提供了对gzip格式的支持,ZipFile、ZipInputStream、ZipOutputStream则用于处理zip格式的文件。 所以,你应当根据你的具体需求,选择不同的压缩技术:如果只需要压缩/解压缩数据,你可以直接用zlib实现,如果需要生成gzip格式的文件或解压其他工具的压缩结果,你就必须用gzip或zip等相关的类来处理了。 测试代码 import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.Arrays; import java.util.zip.DataFormatException; import java.util.zip.Deflater; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; import java.util.zip.Inflater; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; public class TestCompressedSerializaion { public static BigObject createBigObject() { final int SIZE = 1 << 12; int[] bigArray = new int[SIZE]; for (int i = 0; i < SIZE; ++i) { bigArray[i] = (int) (Math.
阅读全文 »

JDK7中的队列实现

时间: 2013-08-07   |   分类: Java     |   阅读: 24 字 ~1分钟
JDK7之前已有的队列实现 JDK7之前已有的队列实现分为两类:用于一般用途的实现和用于并发的实现。 用于一般用途的队列实现 LinkedList实现了Queue接口,为offer、poll等方法提供了先入先出队列操作。 PriorityQueue类是基于堆(数据结构)的优先队列。如果PriorityQueue在构造时指定比较器Comparator,则用比较器对元素排序,否则使用元素的自然排序(通过其java.util.Comparable实现)。队列的取操作(poll、remove、peek和element)访问队列头部的元素。队列头部是顺序上最小的元素或具有相同最小值的元素之一。PriorityQueue的iterator方法提供的爹抬起不保证按特定顺序遍历PriorityQueue中的元素。 并发队列实现 java.util.concurrent包下包含一系列同步的Queue接口和类。 ConcurrentLinkedQueue基于链接节点的、线程安全的队列。并发访问不需要同步。因为它在队列的尾部添加元素并从头部删除它们,所以只要不需要知道队列的大小。ConcurrentLinkedQueue对公共集合的共享访问就可以工作得很好。收集关于队列大小的信息会很慢,需要遍历队列。 http://www.cs.rochester.edu/research/synchronization/pseudocode/queues.html JDK5加入了BlockingQueue接口和五个阻塞队列类。阻塞队列BlockingQueue扩展了Queue的操作,元素添加操作会在没有空间可用时阻塞,而元素获取操作会在队列中没有任何东西时阻塞。 五个队列所提供的各有不同: ArrayBlockingQueue:一个基于数组实现的有界(大小有限)队列。 LinkedBlockingQueue:一个基于链接节点实现的可选有界队列。如果LinkedBlockingQueue在构造时没有设定容量大小,添加元素永远不会有阻塞队列的等待(至少在其中有Integer.MAX_VALUE元素之前不会)。 PriorityBlockingQueue:一个基于堆实现的无界优先级队列。 DelayQueue:一个基于堆实现的、基于时间的调度队列。 SynchronousQueue:一个利用BlockingQueue接口的会合(rendezvous)机制。它没有内部容量。它就像线程之间的手递手机制,类似于生活中一手交钱一手交货这种情况。在队列中加入一个元素的生产者会等待另一个线程的消费者。当这个消费者出现时,这个元素就直接在消费者和生产者之间传递,永远不会加入到阻塞队列中。公平模式下等待线程按照FIFO顺序访问队列,非公平模式下等待线程访问顺序不定。 JDK7的TransferQueue JDK7加入了继承自BlockingQueue的TransferQueue接口和及其实现LinkedTransferQueue:一个基于链接节点实现的无界TransferQueue。 TransferQueue可以让使用者决定使用正常的BlockingQueue语义还是有保障的手递手机制,因而比SynchronousQueue更通用和有效。当队列内已经存在元素时,调用transfer会确保所有已有元素在此传递元素之前被处理。DougLea称之为容量智能化,LinkedTransferQueue实际上是ConcurrentLinkedQueue,(在公平模式下)SynchronousQueue, 无界的LinkedBlockingQueues等的超集。 TransferQueue混合了若干高级特性的同时,也提供了更高的性能。LinkedTransferQueue相比不公平模式SynchronousQueue,性能超过3倍;相比公平模式SynchronousQueue,性能超过14倍。SynchronousQueueJDK5实现是使用两个队列(用于等待生产者和等待消费者),用一个锁保护这两个队列。而LinkedTransferQueue实现使用CAS操作进行非堵塞操作,减少了锁的开销,避免序列化瓶颈。 获得TransferQueue队列大小会很慢,需要遍历队列。 http://tech.puredanger.com/2009/02/28/java-7-transferqueue/ http://www.blogjava.net/yongboy/archive/2012/02/04/369575.html
55 56 57 58 59 60 61 62 63

Programmer & Architect

662 日志
27 分类
1472 标签
RSS 订阅
GitHub Twitter FB Page
© 2009 - 2023 Mryqu's Notes
Powered by - Hugo v0.120.4
Theme by - NexT
0%