imcs初探
imcs简介
https://github.com/knizhnik/imcs
翻译过来是在内存上的列存储,在对于一张‘静态’的表计算方面很有优势,在许多聚合运算中都有使用线程并行计算,而且其中使用了迭代器来对数据进行tile分割,数据存储在pg的共享内存中,在启动多个session都能够对这块内存进行操作,提高了查询效率。
imcs安装
第一步:修改Makefile或者将imcs目录拷贝到/postgres/contrib/目录下
vim Makefile
#ifdef USE_PGXS
PG_CONFIG = /usr/local/postgres/bin/pg_config //pg的安装目录
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)
#else
#subdir = contrib/imcs
#top_builddir = ../..
#include $(top_builddir)/src/Makefile.global
#include $(top_srcdir)/contrib/contrib-global.mk
#endif [root@centos01 imcs]# make && make install
第二步:创建imcs扩展
postgres=# create extension imcs ; postgres=# \dx
List of installed extensions
Name | Version | Schema | Description
---------+---------+------------+------------------------------
imcs | 1.1 | public | In-Memory Columnar Store postgres=# CREATE TABLE customer
postgres-# (
postgres(# customer_id TEXT,
postgres(# review_date DATE,
postgres(# review_rating INTEGER,
postgres(# review_votes INTEGER,
postgres(# review_helpful_votes INTEGER,
postgres(# product_id CHAR(),
postgres(# product_title TEXT,
postgres(# product_sales_rank BIGINT,
postgres(# product_group TEXT,
postgres(# product_category TEXT,
postgres(# product_subcategory TEXT
postgres(# );
第三步:生成user define funtion来对表进行查询
postgres=# select cs_create('customer','review_date','product_id'); postgres=# select customer_load();
注意1:操作此步会有许多错误,如果没有在postgres.conf中配置,由于没有初始化imcs的hash_table的前提下,往共享内存上插入是段错误的,但是此处没有打印出报错信息。
配置项:shared_preload_libraries = 'imcs'
注意2:postgres=# select customer_load();
ERROR: NULL values are not supported by columnar store
CONTEXT: PL/pgSQL function customer_load(boolean,text) line 1 at RETURN
在load数据时是不支持NULL value,但是imcs提供了可配置的选项让0来替代null数据,但是这种替代是毫无意义的,很多计算都是不准确的。
配置项:imcs.substitute_nulls=1
注意3:由于imcs使用字典来存储字符串,因此在开辟hash的时候需要将字典指定大一些,才能够装下这些字典。
配置项:imcs.dictionary_size=100000
注意4:还有一个配置选项是关于多线程的,如果配置>=2,则都会启动多线程来对存储上的数据分割计算,最后merge产生结果
配置项:imcs.n_threads=4
postgres=# select customer_load();
customer_load
---------------
176773
此时已经将pg的一张表的数据全部load到共享内存上了,可以使用imcs提供的udf函数对共享内存进行查询了。
查询对比如下:
postgres=# select cs_sum(review_rating) from customer_get();
cs_sum
-------- ( row) Time: 16.420 ms
postgres=# select sum(review_rating) from customer ;
sum
-------- ( row) Time: 133.685 ms
对于大部分聚合运算通过imcs提供的udf函数查询都能够比正常sql对pg原生表查询速度快。
还需要注意
postgres=# insert into customer select * from customer limit ;
INSERT
Time: 12.974 ms
postgres=# select cs_sum(review_rating) from customer_get();
cs_sum
-------- postgres=# select sum(review_rating) from customer ;
sum
--------
由此可以得到结论:在insert、update、delete数据后需要重新load数据到共享内存。
优点:1、多线程并行计算
2、运算效率高
3、迭代器是个多叉树结构,能够对tile数据mapreduce。
缺点:1、在做增删改操作后需要重新load一遍数据,如果数据量大,就消耗的时间
2、不支持null数据
3、代码使用宏编写,不易看懂,很难进行二次开发
imcs初探的更多相关文章
- 初探领域驱动设计(2)Repository在DDD中的应用
概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值类型和领域服务,也稍微讲到了DDD中的分层结构.但这只能算是一个很简单的介绍,并且我们在上篇的末尾还留下了一些问题,其中大家讨论比较多的, ...
- CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探
CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码 ...
- 从273二手车的M站点初探js模块化编程
前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数 ...
- JavaScript学习(一) —— 环境搭建与JavaScript初探
1.开发环境搭建 本系列教程的开发工具,我们采用HBuilder. 可以去网上下载最新的版本,然后解压一下就能直接用了.学习JavaScript,环境搭建是非常简单的,或者说,只要你有一个浏览器,一个 ...
- .NET文件并发与RabbitMQ(初探RabbitMQ)
本文版权归博客园和作者吴双本人共同所有.欢迎转载,转载和爬虫请注明原文地址:http://www.cnblogs.com/tdws/p/5860668.html 想必MQ这两个字母对于各位前辈们和老司 ...
- React Native初探
前言 很久之前就想研究React Native了,但是一直没有落地的机会,我一直认为一个技术要有落地的场景才有研究的意义,刚好最近迎来了新的APP,在可控的范围内,我们可以在上面做任何想做的事情. P ...
- 【手把手教你全文检索】Apache Lucene初探
PS: 苦学一周全文检索,由原来的搜索小白,到初次涉猎,感觉每门技术都博大精深,其中精髓亦是不可一日而语.那小博猪就简单介绍一下这一周的学习历程,仅供各位程序猿们参考,这其中不涉及任何私密话题,因此也 ...
- Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用
一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性 ...
- NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例
一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象.消息被发送到队列中,“消息队列”是在消息的传输过程中保存消息的容器 ...
随机推荐
- (十六)WebGIS中偏移补偿量引发的问题之探讨
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 在上一章里讲解地图平移功能的实现时,我在最后提出了两个问题: ...
- 6.Struts2简单类型数据的接受
简单类型数据的接收 在Action类中定义与请求参数同名的属性, 即,要定义该属性的set方法,便能够使struts2自动接收请求参数并赋予同名属性. 简单类型数据的接受举例: 新建工程项目,名称为: ...
- PHP+MySQL中实现分页
你只需要在需要添加页的页面加入这几行代码 <?phpinclude 'form.class.php'; $p=new Page(100, 'Demo01.php');//这里需要传递两个参数,参 ...
- C++ 版本的 行为树的简单实现
如果你想转载这篇文章呢,请严格按照以下格式注明出处和作者 出处:http://www.cnblogs.com/anxin1225/p/4827294.html 作者:Anxin1225.Bianchx ...
- ROWNUMBER() OVER( PARTITION BY COL1 ORDER BY COL2)用法,先分组,然后在组内排名,分组计算,主表与附表一对多取唯一等
ROWNUMBER() OVER( PARTITION BY COL1 ORDER BY COL2)用法 今天在使用多字段去重时,由于某些字段有多种可能性,只需根据部分字段进行去重,在网上看到了row ...
- java——获取从控制台输入的数据的方法
一.使用标准输入串System.in System.in.read(); //一次只读入一个字节数据,但是我们往往希望获得的是一个字符串或者一组数字 二.使用Scanner获得一个字符串或一组 ...
- Storm的BaseBasicBolt源码解析ack机制
我们在学习ack机制的时候,我们知道Storm的Bolt有BaseBasicBolt和BaseRichBolt.在BaseBasicBolt中,BasicOutputCollector在emit数据的 ...
- 三道Javascript的练习题
有语句“var x=0;while(____) x+=2;”,要使while循环体执行10次,空白处的循环判定式应写为: A.x<10B. x<=10C.x<20D.x<=20 ...
- node学习笔记
一.准备(github地址) 什么是Javascript? ... Javascript能做什么? ..... 浏览器中的Javascript可以做什么? 操作DOM(增删改查) AJAX/跨域 BO ...
- kmdjs api reference
总览 kmdjs的主要就两个API:kmdjs.config和define kmdjs.config kmdjs.config是用于项目整体配置,一般的配置如下所示: kmdjs.config({ n ...