首页 > 编程知识 正文

时文精析(FastDB杂谈)

时间:2023-05-03 07:00:10 阅读:121317 作者:1376

fastdb仍然方便简单,但在使用中发现了许多问题:

例如:

1、数据库对内存消耗真的太大了,特别是在数据量达到千万级时尤其明显。

2、数据量达到千万后,性能远远高于预期,可能是因为服务器内存不足。 事务太大,提交时间很长。

3、并发访问模式下,同一进程的线程只能在同一模式下使用,只有read可以同时访问。 不可同时执行write (多个write线程)。 过程之间也是如此。 也就是说,如果同时运行多个write,则会发生相互阻止,甚至阻止write进程的读取操作。 因此,它适合于同时读取操作或仅具有一个同时写入操作的模式。 (毕竟只有3万行程序,没有记录锁,也没有页面级的锁,这很正常。)

4、程序发生异常时,可以通过清理信号量进行数据文件的恢复,但有时数据文件无法恢复,导致数据丢失。 幸运的是,有在线备份机制和多机备份功能。

尽管如此,在适量的数据规模下,其性能非常粗暴,而且容易使用。 因此,如果一个数据规模高达百万级的项目需要简单的并发和大量的插入、搜索和计算,fastdb是一个非常好的选择。 毕竟代码很精致,如果需要的话可以自己修改源代码。

磁盘模式与非磁盘模式的性能http://blog.csdn.net/hejianhua/article/details/6694356

在磁盘模式下,所有数据都写入磁盘上的文件。 在此模式下,性能与常规数据库相同。 在非磁盘模式下,网络上有一篇非常高效的文章,比较了fastdb和磁盘数据库的性能。 默认情况下为磁盘模式。 使用非磁盘模式,重新编译并加入

-DDISKLESS_CONFIGURATION

文章: http://www.360doc.com/content/11/0227/02/6001117 _ 96477992.shtml

请注意,如果使用非磁盘模式,则进程会因为内存越界问题而崩溃。 这是因为,非盘模式的fastdb是被分割成大的共享存储器的安装,所以如果超过该存储器的容量,则程序有可能发生崩溃。

fastdb 共享内存模式下的限制

虽然最近项目使用的是fast db,但为了提高访问效率,fast db是在diskless模式下编译的。

共享内存的最大大小受系统参数限制。

以下数据是Linux im_monitor 2.6.9-42.ELsmp的默认值:

cat /proc/sys/kernel/shmmax

33554432

默认大小均为32M

同样,fastdb的代码也使用32M作为容量上限,越界后不再进行扩展;过程结束;

具体代码行位于inc/database.h文件中

#ifdef DISKLESS_CONFIGURATION

//indisklessconfiurationdatabasecannotbereallocated

constsize _ tdbdefaultinitdatabasesize=32 * 1024 * 1024;

#else

constsize _ tdbdefaultinitdatabasesize=1024 * 1024;

#endif

为了使fastdb在更大的共享内存中工作,需要进行以下两点变更。

1、系统参数修改

修改/etc/sysctl.cfg以添加以下内容:

kernel.shmmni=4096

kernel.shmall=2097152

kernel.shmmax=1073741824

sysctl -p执行;

或者添加到echo 1073741824/proc/sys/kernel/shmmax、启动脚本中;

2、修改fastdb源代码

constsize _ tdbdefaultinitdatabasesize=32 * 1024 * 1024; 修正为适当的数值; 例如32-1024

考虑到共享内存的大小限制和无法动态扩展,容量将超过限制,进程无法重新分配,并按原样终止。 在大容量系统中,fastdb数据可能超过2G,虚拟内存的总使用量可能接近3G,因此32位操作系统可以切换到文件系统,而不使用共享内存fastdb。 实际上,文件方式也是用map方式实现的。

快速资料库学习笔记

这几天我一直在学习使用fastdb。 写一些学习心得和笔记,供你参考!

1,register_in ) )宏不能用于主函数;

2 )更新和删除操作的光标为updatecurrsor,其他为一般的currsor;

3、光标的当前值是当前查询的对象。

4、客户端-服务器结构程序需要使用cli接口,程序中包含cli.lib

5,在CBuilder中使用时

fastdb.lib,链接出现omf格式问题,直接将所有的src目录下的文件(有几个cpp从名字可以发现是其他平台或者用不上的可以不要)加到一个CBuilder的lib工程里边,然后build生成fastdb.lib就可以解决这个问题.同样使用cli的时候也可能出现这个问题,和上边一样,将cli.cpp,cgistub.cpp,repsock.cpp,stdtp.cpp,w32sock.cpp添加到一个lib工程里边,生成cli.lib即可解决问题.
6,不同的数据库之间共享classes,首先定义class,用register_unassigned()注册类,使用的时候游标有一个你要操做的数据库的指针作为参数.以此标识你要操作的数据库.如果你要插入数据的话,insert()函数这是是一个database类的成员使用.以此标识要插入的数据库.
7,fastdb的类(也就是表的数据成员都必须是public),否则外部不可访问.
8,fastdb表的字段可以是嵌套的结构或者动态增长的数组类型.并且表中可以有方法.
9,fastdb支持autoincrement字段,int4类型可以在descriptor中声明为autoincrement.
10,使用fastdb自己带的subsql程序的export命令可以将内存数据库导出成一个xml文件.
11,fastdb的inverse reference 保证了在你删除数据库中的记录的时候数据的引用完整性.失眠的月饼删除数据库中的记录的时候,inverse reference自动更新.
12,fastdb1.20以后支持cascade deletes,只要相应的字段声明为owner.如果包含reference的字段为owner则这个字段同时要用relation宏声明.

对开源内存数据库FastDB作了一些测试。
采用两个long字段作为表的字段,首先使用带有文件映像的方式,结果是:
1. 字段申明时FIELD和KEY(,INDEXED)在存储量上没有区别,但是KEY(,HASHED)将额外占用大量空间,几乎增加一倍。
2. 从1,000,000条记录(64M)中查询1,000,000次,耗时5秒,平均每秒20万次,加上修改操作似乎影响不大,插入1,000,000条记录也是5秒。
将FastDB库编译成DISKLESS模式后,对每个表的大小似乎有限制,而且是一种以崩溃的方式出现的,同样的记录只能插入100,000个多一些。好像数据库申明时对初始大小的规定没有作用。

 


1. FastDB中的每个对象(记录)有12字节的头。
   每个对象都是按32字节对齐的。
   每个额外的索引占用16字节。
   每个对象还有4字节的标识OID(Object Identifier),用于对对象的访问,并且OID有两个Current和Shadow,这样每个对象标识就占用8个字节,而且所有对象标识的数量是按2的倍数分配的。
   如果分配的虚拟内存被耗尽,则总内存将会变为原来的两倍。

2. 在无盘模式下,数据库声明时的初始内存参数dbInitSize的单位是字节。当初始分配的内存不足时,会抛出OutOfMemory异常。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Database类

dbDatabase类控制与数据库的应用交互,比如对数据库的并发访问控制的同步,事务管理,内存分配,纠错处理等等。

         dbDatabase类的构造函数允许程序员指定一些数据库的参数。

dbDatabase(dbAccessType type = dbAllAccess,

                      size_t dbInitSize = dbDefaultInitDatabaseSize,

                      size_t dbExtensionQuantum = dbDefaultExtensionQuantum,

                      size_t dbInitIndexSize = dbDefaultInitIndexSize,

                      int nThreads = 1);

访问模式有以下几种:

访问类型

描述

dbDatabase::dbReadOnly

只读模式

dbDatabase::dbAllAccess

普通模式

dbDatabase::dbConcurrentRead

Read only mode in which application can access the database concurrently with application updating the same database in dbConcurrentUpdate mode

dbDatabase::dbConcurrentUpdate

Mode to be used in conjunction with dbConcurrentRead to perform updates in the database without blocking read applications for a long time

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。