一个共享内存hash
Background
我们的多进程程序碰到一个需求:做key-value查询,然后拿获取到的value去做一些事情。这些key-value存储在很多词典文件中,数量级>10w,如果每个进程都加载一份,内存上是很浪费的,所以需要共享访问,看起来就像是一个IPC使用std::map的场景。有很多方法都可以选择,挑选几类比较下。
Socket
多进程程序作为clients,加载词典提供查询服务的程序作为server,通过网络来交互,很好的避免了共享带来的资源竞争,架构上看是解耦的,细看一下交互过程,client首先send request,触发server查询词典,经过两次memcpy后将value送出,随后client也要经过两次memcpy,最后get response,性能上比较差。
SQLlite
同一sqllite db可以被多进程直接访问,性能相比socket要好的多了,但它的写操作是锁保护的,即同时只能有一个进程访问。sqllite是内存数据库,支持KeyValueDatabase,但根据sqllite官方公布的测试数据来看select性能并不理想。
Memory-mapped file
内存映射文件是较理想的进程共享方法,这里是使用方法。我们的词典文件比较多也比较大,频繁的read/write必然会产生大量的系统调用和memory copy,这块可以用mmap来优化(详见)。词典文件内容仅仅从disk映射到了内存,从mmap到hash还需要把原始数据映射成hash,这块如果每个进程都要做一次,性能也好不到哪里。
Shm-hash
shm_hash本质是一个hash,它的时间复杂度也是O(1),设想我们给hash增加一个方法:
//从内存地址直接映射成hash
hash_int_from_memory(void *mem, unit32_t len)
这个方法看似不起眼,但却可以为我们提供避免重复构造hash的功能。
Final
用伪代码描述下shm_hash结合mmap在各个进程的构造过程
//******begin
//进程A将数据导入到hash
fd = fopen("hash.mmap");
lseek(fd);
ptr = mmap(fd);
hash_int_from_memory(ptr);
while(have) {
hash_add("key", "value");
}
//******end //******begin
//进程A将数据导入到hash
fd = fopen("hash.mmap");
hash_int_from_memory(ptr);
//******end
一个共享内存hash的更多相关文章
- Linux 驱动学习笔记05--字符驱动实例,实现一个共享内存设备的驱动
断断续续学驱动,好不容易有空,做了段字符驱动的例子.主要还是跟书上学习在此记录下来,以后说不定能回过头来温故知新. 首先上驱动源码 gmem.c: /************************* ...
- Linux学习笔记(14)-进程通信|共享内存
在Linux中,共享内存是允许两个不相关的进程访问同一个逻辑内存的进程间通信方法,是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式. 不同进程之间共享的内存通常安排为同一段物理内存.进程可 ...
- linux 共享内存 shmat,shmget,shmdt,shmctl
shmget int shmget(key_t key, size_t size, int flag);//开辟一段共享内存 key_t key :标识符的规则() size_t size :共享内存 ...
- linux进程间通信-共享内存
转载:http://www.cnblogs.com/fangshenghui/p/4039720.html 一 共享内存介绍 共享内存可以从字面上去理解,就把一片逻辑内存共享出来,让不同的进程去访问它 ...
- Linux进程间通信之共享内存
一,共享内存 内核管理一片物理内存,允许不同的进程同时映射,多个进程可以映射同一块内存,被多个进程同时映射的物理内存,即共享内存. 映射物理内存叫挂接,用完以后解除映射叫脱接. 1,共享内存的特点 ...
- linux下共享内存mmap和DMA(直接访问内存)的使用 【转】
转自:http://blog.chinaunix.net/uid-7374279-id-4413316.html 介绍Linux内存管理和内存映射的奥秘.同时讲述设备驱动程序是如何使用“直接内存访问” ...
- php 共享内存
共享内存主要用于进程间通信 php中的共享内存有两套扩展可以实现 1.shmop 编译时需要开启 --enable-shmop 参数 实例: $shm_key = ftok(__FILE__, 't ...
- C扩展 从共享内存shm到memcache外部内存
引言 - ipc - shm 共享内存 本文会通过案例了解ipc 的共享内存机制使用, 后面会讲解C 如何使用外部内存服务memcached. 好先开始了解 linux 共享内存机制. 推荐先参看下面 ...
- Linux共享内存(一)
inux系统编程我一直看 <GNU/LINUX编程指南>,只是讲的太简单了,通常是书和网络上的资料结合着来掌握才比较全面 .在掌握了书上的内容后,再来都其他资料 . 原文链接 http:/ ...
随机推荐
- 【Unity3D游戏开发】之全局管理类的几种方式 (十六)
如何在Unity中实现全局管理类?由于Unity脚本的运行机制和面向组件编程(COP)的思想,实现起来和普通的方式略有差别. 第一种方式是使用静态类.适合存储一些全局的变量,如游戏当前关卡.玩家得分等 ...
- matlab求解二元一次方程组的解得表达式
- px和em的区别(转)
在国内网站中,包括三大门户,以及“引领”中国网站设计潮流的蓝色理想,ChinaUI等都是使用了px作为字体单位.只有百度好歹做了个可调的表率.而 在大洋彼岸,几乎所有的主流站点都使用em作为字体单位, ...
- 安装numpy+mkl
引子: 运行from sklearn.dataset import load_iris 时提示: Traceback (most recent call last): File "F:/gi ...
- Page Visibility API(页面可见性)
页面可见性: 就是对于用户来说,页面是显示还是隐藏, 所谓显示的页面,就是我们正在看的页面:隐藏的页面,就是我们没有看的页面. 因为,我们一次可以打开好多标签页面来回切换着,始终只有一个页面在我们眼前 ...
- Java面向对象三大特点之多态
概念: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作,如图所示: 多态性是对象多种表现形式的体现,同一个事件发生在不同的对象上会产生不同的结果. ...
- 某篇ctr预估ppt的链接
csdn上面有一篇ppt,但是下载分太贵了.里面东西看起来讲的还可以.看看能不能嵌入. http://download.csdn.net/detail/u012289698/9371461 <i ...
- USACO2007Monthly Expense月度开销
Description Farmer John是一个令人惊讶的会计学天才,他已经明白了他可能会花光他的钱,这些钱本来是要维持农场每个月的正常运转的.他已经计算了他以后N(1<=N<=100 ...
- Spring—Quartz定时调度CronTrigger时间配置格式说明与实例
1 .CronTrigger时间格式配置说明 CronTrigger配置格式: 格式: [秒] [分] [小时] [日] [月] [周] [年] 序号 说明 是否必填 允许填写的值 允许的通配符 1 ...
- request获取各种信息
private Map<String, String> getHeadersInfo(HttpServletRequest request) { Map<String, String ...