在网上看了主存数据库的性能测试,与BerkeleyDB和SQLite相比,fastdb的性能还稍好一些,时间和精力有限,本人对SQLite、BerkeleyDB进行了系统的分析研究在这里,我们只需简单分析fastdb效率的实现。
其他报告显示,在fastdb磁盘模式下,批量提交事务时fastdb的性能比SQLite的性能高3-10倍,但每次提交一个事务时fastdb的性能这是因为在磁盘模式下,fastdb经常将数据同步到磁盘,而I/o操作访问物理磁盘,导致性能瞬间下降几个数量级。
因此,fastdb的作者提供了两种方案,一种是定时备份,另一种是fastdb的无盘模式。
)1)磁盘模式
磁盘模式的优点是服务器崩溃时不会丢失与文件同步的数据部分。 另一方面,频繁的I/o操作会导致性能下降。 那么,磁盘模式是如何实现的?
file.cpp文件中将显示:
首先在主目录中打开*.fdb文件
FD=:3360open(name,open_flags,0666 );
if(FD0 ) {
int orig_errno=errno;
故障定位文件' % s '-FD-% d,错误跟踪- % dn ),
name,fd,orig_errno;
return orig_errno;
}
然后mmap ) )使用映射
mapaddr=(char* ) mmap null,mmapSize,
(flags read_only )? prot _ read : prot _ read|prot _ write,
mmap_attr,fd,0;
if(mmapaddr==(char* )-1 ) {
status=errno;
mmap addr=空;
if(FD=0) {
:3360关闭(软盘;
}
返回状态;
}
map的一种著名映射机制是可以将数据同步到文件中
)2)无盘模式
fastdb的默认模式是磁盘模式,可以通过更改config.h,然后重新编译来实现
//diskless _ configuration-only in-memorytemporarydatabase
拆下//
# define diskless _ configuration1//这就是无盘模式
无盘模式完全是内存操作。 在此使用system v的共享内存。 sync.cpp的代码如下:
intfd=:3360打开(filename,O_RDWR|O_CREAT,ACCESS_PERMISSION_MASK ); 用/tmp创建*.fdb文件
if(FD0 ) {
if (文件名!=name
delete[] fileName;
}
返回假;
}
:3360关闭(软盘;
intkey=Getkeyfromfile(filename ); //根据文件名创建密钥
if (文件名!=name
delete[] fileName;
}
if(key0) {
返回假;
}
shm=shmget(key,doalign(size,4096 ),IPC _ creat|access _ permission _ mask ); //创建共享内存
if(shm0) {
返回假;
}
ptr=(char* ) shmat ) shm,NULL,0 ); //装载到本进程
-----------------
译文: https://blog.csdn.net/huanzai2/article/details/24404247