今天再来介绍一个小的优化点,是一个通过使用fastutil工具包对数据格式进行优化。首先来明确一个东西,什么是fastutil? 通过使用fastutil可以使得对象占用更小的内存,更快的存取速度;通过这两个特点,我们可以将Spark作业中用的一些map,list等结构替换成fastutil来提高Spark作业的运行效率。 fastutil的每一种集合类型,都实现了对应的Java中的标准接口(比如fastutil的map,实现了Java的Map接口),因此可以直接放入已有系统的任何代码中。 明确了fastutil以后,我们来看看其在Spark代码中的应用场景。 未使用fastUtil之前 ? 使用fastUtil之后 总结:在项目某些使用了map等集合的地方,如果这个集合较大,就可以考虑采用fastutil代替传统的map等结构,从而提高程序的运行效率。
重新装了个系统,然后新装Android Studio导入项目时一直在下载 fastutil-7.2.0.jar 原因是需要科学。
fastjson</artifactId> <version>1.1.41</version> </dependency> <dependency> <groupId>fastutil </groupId> <artifactId>fastutil</artifactId> <version>5.0.9</version> </dependency>
其他可选优化 (1) 使用高性能的集合类库——fastutil fastutil是扩展了Java标准集合框架(Map、List、Set)的类库,提供了特殊类型的map、set、list和queue;fastutil ,以及实用的IO类,来处理二进制和文本类型的文件;fastutil最新版本要求Java 7以及以上版本;fastutil的每一种集合类型,都实现了对应的Java中的标准接口(比如fastutil的map fastutil还提供了一些JDK标准类库中没有的额外功能(比如双向迭代器)。 fastutil除了对象和原始类型为元素的集合,fastutil也提供引用类型的支持,但是对引用类型是使用等于号"=="进行比较的,而不是equals()方法。 我们可以使用fastutil提供的集合类,来替代自己平时使用的JDK的原生的Map、List、Set 如果算子使用了外部变量而且是某种比较大的集合,那么可以考虑使用fastutil改写外部变量,或者在算子函数里
这一步可解决如下问题: 下载卡在: fastutil-8.4.0-sources jar 报错:SSL peer shut down incorrectly 某些同步失败 2️⃣ 添加代码 在你项目的这个位置
in memory on mbk.local:50311 (size: 717.5 KB, free: 332.3 MB) (2)数据结构调优 1) 优先使用数组和原生类型来替代容器类,或者使用fastutil 找个包提供的容器类型,fastutil的官方链接是http://fastutil.di.unimi.it/。
fastutil FastUtil是一个高性能的集合框架,提供了以基础类型为元素的集合来代替JDK原生的集合类型。基础类型为元素的集合避免了大量的基础类型的装箱拆箱。 因此,在程序进行集合的遍历、根据索引获取元素的值和设置元素的值的时候,fastutil可以提供更快的存取速度以及更低的内存消耗。 数据量 HashMap ConcurrentHashMap SparseArray Guava fastutil 32 2352 2368 832 4344 624 256 18480 18496 6208 参考资料 Java对象布局: https://www.jianshu.com/p/91e398d5d17c fastutil官网: https://fastutil.di.unimi.it/ Guava
fastutil FastUtil是一个高性能的集合框架,提供了以基础类型为元素的集合来代替JDK原生的集合类型。基础类型为元素的集合避免了大量的基础类型的装箱拆箱。 因此,在程序进行集合的遍历、根据索引获取元素的值和设置元素的值的时候,fastutil可以提供更快的存取速度以及更低的内存消耗。 数据量 HashMap ConcurrentHashMap SparseArray Guava fastutil 32 2352 2368 832 4344 624 256 18480 18496 6208 参考资料 Java对象布局: https://www.jianshu.com/p/91e398d5d17c fastutil官网: https://fastutil.di.unimi.it/ Guava
其实市面上有很多其他优秀的集合库实现的,我在这里大致列一下我这边会测试的几个: FastUtil: 一个意大利的计算机博士开发的集合库。 例如,FastUtil的测试如下: @Benchmark @OperationsPerInvocation(OperationsPerInvocation) def testFastUtil map = new Long2LongArrayMap(MapSize) with LongLongOp testSetTraverse(map) printlnObjectSize("fastutil
对象池化,Candle、事件包装重用;primitive 集合(fastutil/HPPC),尽量零装箱。延迟敏感路径避免 BigDecimal 运算,批量落盘,内存对齐。 性能:Disruptor 事件环,预分配对象;fastutil LongOpenHashSet 做去重;少用 BigDecimal,必要处汇总线程集中转换。
Shuffle (3)使用Kryo序列化机制,需要注册自定义类 sparkConf.registerKryoClasses(new Class[]{***.class}); 3.6、使用 FastUtil 优化数据格式 Fastutil是java标准化集合框架(Map,List,Set)的类库扩展以及替代品,可以减小内存占用并提供更快的查询速度,Spark使用FastUtil的场景: (1)如果算子函数中使用了外部变量 ,第一步可以广播变量,第二步可以使用Kryo序列化机制,第三步如果是较大的数据集合可以使用fastutil进行重写; (2)Task要执行的计算逻辑里,有较大的集合时可以使用fastUtil,在一定程度上可以减小内存占用
fastutil库(http://fastutil.di.unimi.it/)为与Java标准库兼容的原始类型提供方便的集合类。 2,尽可能避免使用有很多小对象和指针的嵌套结构。
如果实在需要使用集合,推荐一个比较节约内存的集合工具,fastutil。这里面包含了JKD集合中绝大部分的实现,而且比较省内存。 小技巧 在上面的三个原则基础上,提供两个小技巧。
如果实在需要使用集合,推荐一个比较节约内存的集合工具,fastutil。这里面包含了JKD集合中绝大部分的实现,而且比较省内存。 (4)小技巧。 在上面的三个原则基础上,提供两个小技巧。
如果实在需要使用集合,推荐一个比较节约内存的集合工具,fastutil。这里面包含了JKD集合中绝大部分的实现,而且比较省内存。 小技巧 在上面的三个原则基础上,提供两个小技巧。
FastIOC: 轻量级IOC容器,大家可以用AutoFac代替 2.RedisUtil是对StackExchange.Redis.dll封装的处理类,地址:https://gitee.com/code2roc/FastUtil
FastUtil也是一个好用的API,它继承了Java Collection Framework,提供了数种特定类型的容器,包括映射map、集合set、列表list、优先级队列(prority queue
如果实在需要使用集合,推荐一个比较节约内存的集合工具, fastutil。 这里面包含了 JKD 集合中绝大部分的实现,而且比较省内存。 小技巧 在上面的三个原则基础上,提供两个小技巧。
FastUtil是另一种相似的API,其继承了JavaCollectionFramework,提供了多种特定类型的容器,包括map映射、setset、list、prorityqueue)、为java.util
另外使用fastutil 包下面的集合类代替java 的集合类, 减少广播数据所占大小 sparkStreaming 中从source 获取的数据默认是存储在内存中的,那么处理过的批次数据会不会一直存储在内存中中