我搜索了支持整数键和整数值的键值存储.LevelDB似乎是一个不错的选择,但我找不到关于是否支持整数值/键的任何信息
我想知道LevelDB库的'snapshot'工具是否可以创建一个快照引用,即使在关闭open数据库对象之后也可以保存它(因此在后续打开时重用).
我怀疑没有,这导致了后续行动:是否有一种好的/推荐的方法可以在快照瞬间对数据库进行一致的备份,理想情况下即使其他活动仍在继续?(也就是说,没有通过API迭代整个快照键范围?)
(基本上我正在寻找一些类似于通过某个检查点来保存BerkeleyDB-JE的仅附加JDB日志文件的东西.)
因为下面有点长:这是tl; dr; version:快速键和值查找是否存在现有键/值最佳实践,类似于具有持久索引的基于哈希的集合?
我对键值数据库的世界感兴趣,到目前为止还没有弄清楚如何有效地实现以下用例:
假设我们想要序列化一些数据,并通过持久的唯一整数索引在其他地方引用它们.例如:Key = unsigned int,Value = MyData.
数据库应具有快速键查找并确保MyData是唯一的.
现在,当我向数据库插入一个新值时,我可以为它分配一个新的索引键,例如数据库的当前大小,或者为了防止在删除项目后发生冲突,我可以在外部保留一些计数器.
但是,我如何确保不将相同的MyData值插入数据库?到目前为止,它看起来好像这对于键值数据库来说无法有效实现 - 这是正确的吗?即我不希望遍历整个数据库只是为了确保MyData的价值并不在那里已经...
那么实施这个的最佳实践是什么?
对于背景:我在KDevelop上工作,我们使用上面的代码分析缓存.我们实际上有一个上述用例1的自定义实现.如果您对内部感兴趣,请搜索Bucket和ItemRepository,并参阅2以了解ItemRepository的示例用法.
但你可能会同意,这段代码很难理解,因而难以维护.我想将其性能与可能导致更简单代码的替代解决方案进行比较 - 但前提是它不会导致严重的性能损失.考虑到围绕OpenLDAP MDB,Kyoto Cabinet和LevelDB等键值存储性能的炒作,这是我想要开始的地方.
我们在KDevelop中所拥有的 - 据我所知 - 基本上是一种混合磁盘/内存中的哈希映射,它会定期保存到磁盘上(当然,在崩溃的情况下会导致严重的数据损坏等). ).项目基于它们的散列值存储在一个位置,当然,只要散列函数很快,它们也允许相对快速的值查找.增加的扭曲是您还获得某种持久性数据库索引,可用于非常有效地查找项目.
所以 - 长话短说 - 如何用一个关键/价值数据库如LevelDB,Kyoto Cabinet,OpenLDAP MDB来做到这一点 - 你说出来了吗?
我正在阅读leveldb的源代码,特别是.关于互斥锁.
我发现了这个声明:
class SCOPED_LOCKABLE MutexLock {
public:
explicit MutexLock(port::Mutex *mu) EXCLUSIVE_LOCK_FUNCTION(mu)
: mu_(mu) {
this->mu_->Lock();
}
~MutexLock() UNLOCK_FUNCTION() { this->mu_->Unlock(); }
private:
port::Mutex *const mu_;
// No copying allowed
MutexLock(const MutexLock&);
void operator=(const MutexLock&);
};
Run Code Online (Sandbox Code Playgroud)
我发现它SCOPED_LOCKABLE被定义为空,所以为什么在类声明中使用它?
我正在编写一个脚本来收集所有比特币块的哈希值.程序bitcoind,如果更改某个设置,则存储LevelDB数据库中所有块的元数据.每组元数据的关键是块的散列,它通常用作它的标识符.本质上,我试图从每个块中获取元数据的特定部分(事务ID).我正在写的脚本是在Haskell中,尽管我可以在必要时总是执行shell命令.总而言之,我不确定最简单的方法是找到所有块哈希(键),然后调用bitcoind来获取每个块的元数据.如果有任何方法可以直接从LevelDB数据库中获取每个值,那么也可以.什么是最简单有效的方法?
LevelUP文档(https://github.com/rvagg/node-levelup#multi-process-access)中有以下内容:
LevelDB是线程安全的,但不适合通过多个进程进行访问。您只应该从单个Node.js进程中打开LevelDB数据库。Node.js集群由多个进程组成,因此LevelUP实例也无法在它们之间共享。
因此,我无法使用节点群集(http://nodejs.org/api/cluster.html)
是否有另一个选择可以使多进程(或多线程)Node.js应用程序访问LevelDB数据库?
我正在尝试访问Chrome存储indexeddbs生成的leveldbs。我得到键和值。但是它们要么以未知的编码-我尝试了多种方法来检测它们-要么它们以某种方式被加扰。
import plyvel
db = plyvel.DB(dirname, comparator=cmp, comparator_name="idb_cmp1")
for key, value in db:
print(key)
print(value)
Run Code Online (Sandbox Code Playgroud)
我不介意密钥是否按此处所述随机排列。但是,以可读的方式获取键和值会很好。我也不在leveldb中处理二进制数据。
我在python中使用plyvel遍历数据库。可能与以下答案有关:LevelDB C迭代器
LevelDB-Go是Go语言中LevelDB的端口.LevelDB-Go通常被称为Go应用程序的本机替代品.网站没有示例,也没有文档.
我应该通过阅读源代码来学习吗?或者还有另一个包含示例和文档的网站?
库是否支持并发?
我正在编写一个小型 NodeJS 应用程序,我需要某种数据库。LevelDB ( LevelUP ) 和NeDB似乎是最受欢迎的,所以选择哪个......
据维基百科 2016 年 11 月 18 日报道,LevelDB 经常损坏数据。
LevelDB 因不可靠而广受关注,其管理的数据库容易损坏。[13][14][15][16][17][18][19][20] 对过去版本的LevelDB[21][22]的学术研究发现,在某些文件系统下,这些版本的LevelDB中存储的数据可能会在系统崩溃或断电后变得不一致。LevelDB 损坏非常普遍,因此必须将损坏检测内置到使用它的应用程序中。[23]
问题
这是过去的事了,不再是问题了吗?
调整 LevelDB 存储的插入时要考虑的首要因素是什么?
我正在以下形式插入 500M+ 记录:
使用 python plyvel 进入 LevelDB 存储,随着记录数量的增加,速度会急剧下降。我想这是预料之中的,但是我可以考虑一些调整措施来使其更好地扩展吗?
示例代码:
import plyvel
BATCHSIZE = 1000000
db = plyvel.DB('/tmp/lvldbSNP151/', create_if_missing=True)
wb = db.write_batch()
# items not in any key order
for key, value in DBSNPfile:
wb.put(key,value)
if i%BATCHSIZE==0:
wb.write()
wb.write()
Run Code Online (Sandbox Code Playgroud)
我尝试过各种批量大小,这有点帮助,但我希望还有其他东西我错过了。例如,可以利用知道键(或值)的最大长度吗?
leveldb ×10
key-value ×3
node.js ×2
python ×2
c++ ×1
database ×1
go ×1
haskell ×1
indexeddb ×1
indexing ×1
javascript ×1
kyotocabinet ×1
nedb ×1
openldap ×1
python-2.7 ×1