{A}{A2的}
介绍
作为后续行动的第一个文章,我已经改善后的表现,但我仍然保持记录的大小和水桶大小的常量,我已经实现了通过"泛化???函数对象??共享内存???为谁而这将是有用的吗??/ H2>
对于那些谁是新的共享内存,如何提高性能,这将说明如何可以保持文件的I / O到最低限度增加性能。这将alsonbsp是有用的,那些是新的"函数对象和模板??它是如何做这个时间呢??/ H2>
我使用了一个简单的逻辑,构建持久的哈希表。如果我们定义桶的数量,它们的大小和记录的大小,它很容易存储和检索。首先,具有足够的存储空间来存储所有的水桶,其记录的文件被创建。该文件被内存映射。当我们想要写一个记录或读取创纪录的关键是通过哈希函数,这个哈希函数是一个桶偏移派生的哈希值与用户提供的函数对象。然后,我们需要跳出该内存映射文件的基址指针偏移和写入记录或读取记录。在这之前,进行检查,如果在该位置已经存在的记录。如果存在,那么我们跳转到下一个记录,然后被写入该记录。阅读和写作的记录后,内存被刷新到磁盘上的文件。在稍后一点,如果我们需要阅读,创纪录的DB可以被打开,然后提供的密钥,该记录可以检索回。在这里,在这个实现,依赖?代码> FSEEK()??最小化,以创建初始文件。这是一个对大文件的操作步骤。这个实现可以提高到一个部分文件,而不是整个文件映射。
实施细则??/ H2>
?代码> CSharedMemory??类是围绕共享内存API的瘦包装。这是一个简单的共享内存的使用,因此没有进入细节。 CHash是为构建不同类型的对象创建不同tables.nbsp的广义类;
key_type的是哪个表需要创建的密钥类型value_type的:是的价值,这是要配对的关键值存储在类型。哈希是用户需要提供整个表上是依赖的函数对象类型大小是另一个函数的对象类型,需要保持记录的大小与文件大小计算后由用户提供。namespace persistant_hash
{
template<typename key_type,typename value_type,typename hash,typename size>
class CHash
{
private:
long m_nbuckets;
long m_bucketsize;
long m_recsize;
CSharedMemory *m_psm;
CRITICAL_SECTION cs;
PBYTE m_pb;
//unsigned long hash(long key);
hash m_hashobj;
size m_sizeobj;
long writeoffset(long offset,void *p,long size);
long readoffset(long offset,void *p,long size);
long GetbucketOffset(long buckno);
public:
//pass how many number of buckets to construct.
CHash(long nBuck,long nRecinbucket,
hash ho,size so):m_nbuckets(nBuck),m_hashobj(ho),m_sizeobj(so)
{
m_recsize = so();
m_bucketsize = nRecinbucket * m_recsize;
InitializeCriticalSection(&cs);
}
long createdb(wchar_t *p);
long opendb(wchar_t *p);
long closedb();
long writerec(key_type k,value_type* pd);
long readrec(key_type k,value_type* pd,long &offset);
long readnextrec(long offset,value_type* pd);
};
}
我在这里解释几个功能。 CREATEDB创建固定大小的文件,并打开共享内存和映射整个文件和基指针在m_pb存储。{C}
Writeoffset"写入到从basepointer的偏移位置: template<typename key_type,typename value_type,typename hash,typename size>
long CHash<key_type,value_type,hash,size>::writeoffset(long offset,void *p,long size)
{
EnterCriticalSection(&cs);
memcpy((m_pb + offset),p,size);
LeaveCriticalSection(&cs);
return 0;
}
Writerec"写入记录在指定的偏移,如果目前已经有一些记录是,那么它的下一个记录中写道,在这里,它调用函数对象的哈希先发送相同的桶偏移。{体C3}如何使用这个类呢??/ H2>
需要包括这两个文件,并使用命名空间persistant_hash:{的C4}
需要写两个函数对象,这是自定义,包括高性能的哈希函数。 :) {C5的}
您的上浆功能放在这里:{5233}如何实例化??/ H3>{C7-}再见??/ H2>
我希望这将是对一些初学者有所帮助。我会添加到这个系列,直到它成为生产高档NBSP??;