C#有没有好的leveldb移植?我希望在我的纯C#项目中使用leveldb。我在谷歌上搜索了一个C#版本的leveldb,但没有成功。谁能告诉我在哪里可以找到leveldb的C#版本?谢谢不是我知道它,但我一直在我的C#项目中使用它。如果您熟悉C++,则可以创建自己的CLI包装器(应该不会那么麻烦),将其构建为DLL,然后您可以像任何其他程序集引用一样将其加载到C#项目中。有一个用于leveldb的Windows端口,将它导入VisualStudio有点棘手,但如果您遇到问题,我可以上传我的VisualStudio2010解决方案(这是75%的战斗)以及整个设置并准备好构建(CLI包装器)。我可以把它放在github或其他东西上,无论我打算做什么,但我会为你加快速度。就像我说的,我一直在我的C#项目中使用这种方法,而且效果很好。但是,如果您有非常高的性能要求,那么我建议对“作业”进行批处理以减少P/Invoke。示例请注意,我没有编译此代码,但我只是将其作为示例发布。您的头文件可能如下所示:#pragmaonce#include#include"leveldbdb.h"usingnamespaceSystem::Runtime::InteropServices;//创建命名空间namespaceLevelDBWrapperNS{//请注意,size_t会根据构建的目标平台而变化://对于32位构建,size_t是一个32位无符号整数。//对于64位构建,size_t是一个64位无符号整数。//C#中没有等效的size_t,但有一些方法可以//模仿相同的行为。或者,您可以将//size_t更改为unsignedlong对于32位构建或unsignedlonglong(64位)//声明leveldb包装器publicrefclassLevelDBWrapper{private:leveldb::DB*_db;公共:LevelDBWrapper(conststd::stringdataDirectory);~LevelDBWrapper();//给定键的get方法,将数据放入值数组//并根据它分配的数据大小设置valueSize。注意:您必须在C#voidGet(constchar*key,constsize_tkeySize,char*值,size_t&valueSize);//一个接受字符串而不是char*bool的put方法Put(conststd::stringkey,conststd::stringvalue);//一个接受char*指针的put方法boolPut(constchar*key,constsize_tkeySize,constchar*value,constsize_tvalueSize);//删除方法boolDelete(constchar*key,constsize_tkeySize);私有:voidOpen(constchar*dataDirectory);};}你的cpp文件将是:#include"LevelDBWrapper.h"//使用与标头命名空间LevelDBWrapperNS相同的命名空间{LevelDBWrapper::LevelDBWrapper(conststd::stringdataDirectory){Open(dataDirectory.c_str());}LevelDBWrapper::~LevelDBWrapper(){if(_db!=NULL){delete_db;_db=空;}//注意:不要忘记也删除块缓存!!!/*if(options.block_cache!=NULL){删除options.block_cache;options.block_cache=NULL;}*/}boolLevelDBWrapper::Put(constchar*key,constsize_tkeySize,constchar*value,constsize_tvalueSize){leveldb::切片sKey(key,keySize);leveldb::SlicesValue(value,valueSize);返回_db->Put(leveldb::WriteOptions(),sKey,sValue).ok();}voidLevelDBWrapper::Open(constchar*dataDirectory){leveldb::Options选项;//创建数据库环境。这将在//单独的调用之间启用缓存(并提高性能)。这也启用//允许缓存调整的db_stat.exe命令。打开//事务环境leveldb::Optionsoptions;options.create_if_missing=true;//如果存在则打开数据库options.error_if_exists=false;//64Mb读取缓存options.block_cache=leveldb::NewLRUCache(64*1024*1024);//写入将每32Mb刷新一次options.write_buffer_size=32*1024*1024;//如果您执行大量批量操作,那么将//块大小增加到64k块大小可能会更好。使用Snappy时,块大小的2次幂也//也提高了压缩率。options.block_size=64*1024;选项.max_open_files=500;options.compression=leveldb::kNoCompression;_db=空;//打开数据库leveldb::Statusstatus=leveldb::DB::Open(options,dataDirectory,&_db);//检查是否失败if(!status.ok()){//数据库打开失败!if(status.ToString().find("partialrecordwithoutend")!=std::string::npos){//尝试恢复数据库...status=leveldb::RepairDB(dataDirectory,options);if(status.ok()){//成功恢复数据库!正在尝试重新打开...status=leveldb::DB::Open(options,dataDirectory,&_db);}else{//恢复数据库失败!}}//如果失败不可恢复,则抛出异常!if(!status.ok()){throwstd::runtime_error(std::string("无法打开:")+std::string(dataDirectory)+std::string("")+status.ToString());}}}}这应该让你朝正确的方向前进获取显示示例好的,Get会是这样的://返回包含数据的缓冲区并设置bufferLen。//用户必须指定键和键的长度,以便切片//可以构造并发送到leveldb。constunsignedchar*Get(constchar*key,constsize_tkeyLength,[Out]size_t%bufferLen);来源是这样的:constunsignedchar*LevelDBWrapper::Get(constchar*key,constsize_tkeyLength,[Out]size_t%bufferLen){unsignedchar*buffer=NULL;std::字符串值;leveldb::Statuss=db->Get(leveldb::ReadOptions(),Slice(key,keyLength),&value);if(s.ok()){//我们找到了密钥,所以设置缓冲区长度bufferLen=value.size();//初始化缓冲区buffer=newunsignedchar[bufferLen];//设置缓冲区memset(buffer,0,bufferLen);//复制数据memcpy(memcpy((void*)(buffer),value.c_str(),bufferLen);}else{//缓冲区长度为0,因为找不到键bufferLen=0;}returnbuffer;}请注意,不同的数据可能具有不同的编码,因此我觉得在非托管理代码和托管理代码之间传递数据的最安全完整的方法是使用指针和UnmanagedMemoryStream以下是如何在C#中获取与键关联的数据:UInt32bufferLen=0;byte*buffer=dbInstance.Get(key,keyLength,outbufferLen);UnmanagedMemoryStreamums=newUnmanagedMemoryStream(buffer,(Int32)bufferLen,(Int32)bufferLen,FileAccess.Read);//创建一个字节数组来保存来自非托管内存的数据。byte[]数据=新字节[bufferLen];//从非托管内存读取到字节数组.readStream.Read(data,0,bufferLen);//不要忘记释放非托管内存块!!!元帅.FreeHGlobal(缓冲区);同样,我没有编译或运行代码,但它应该让你走上正轨。我看到你也可以使用LMDB(闪存映射数据库,http://symas.com/mdb/),它似乎与LevelDB非常相似,并且带有一个.Net包装器(https://github.com)/ilyalukyanov/Lightning.NET)不知道有多好,还没用过。。。没用过,但是看到了leveldb-sharp。我不知道这里的故事,但该项目在微软的官方Rx-Js页面上。以上是C#学习教程:C#有没有好的leveldb移植?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
