我花了几个小时搜索如何使用bsddb模块的例子,我发现的只有这些(从这里):
data = mydb.get(key)
if data:
    doSomething(data)
#####################
rec = cursor.first()
while rec:
    print rec
    rec = cursor.next()
#####################
rec = mydb.set()
while rec:
    key, val = rec
    doSomething(key, val)
    rec = mydb.next()
有谁知道我在哪里可以找到更多(实用)如何使用这个包的例子?
或者有人会介意分享他们自己编写的使用它的代码吗?
编辑:
我之所以选择Berkeley DB,是因为它具有可扩展性.我正在对大约220万个网页进行潜在的语义分析.我对14个网页的简单测试产生了大约500,000条记录.所以做数学...我的表中将有大约78.6亿条记录.
如果有人知道我可以使用python访问的另一个高效,可扩展的数据库模型,请让我知道它!(lt_kije引起了我的注意,bsddb在Python 2.6中已弃用,并将在3.*中消失)
我需要一个基于磁盘的键值存储,它可以维持大数据集的高写入和读取性能.我知道,订单很高.
我正在尝试使用Java的C BerkeleyDB(5.1.25)库,我看到了严重的性能问题.
我在短时间内得到了稳定的14K docs/s,但是当我达到几十万个文档时,性能会像摇滚一样下降,然后它会恢复一段时间,然后再次下降,等等.这种情况越来越频繁,直到大多数时间我无法获得超过60个docs/s,在1000万个docs之后有一些12K docs/s的孤立峰值.我的db类型选择是HASH,但我也试过BTREE,它是一样的.
我尝试使用10 db的池并在其中散列文档以消除性能下降; 这使写入吞吐量增加到50K docs/s,但对性能下降没有帮助:所有10 db都同时减慢了爬行速度.
我假设文件正在重新组织,我试图找到一个配置参数来影响何时进行这种重组,因此每个池化的db会在不同的时间重新组织,但我找不到任何有用的东西.我尝试了不同的缓存大小,使用setHashNumElements配置选项保留空间,因此不会花时间增长文件,但每次调整都会使情况变得更糟.
我准备给berkeleydb并尝试更复杂的解决方案,比如cassandra,但是我想确保在写完之前我没有在berkeleydb做错事.
这里有没有经验可以通过berkeleydb实现持续写入性能的人?
编辑1:
我已经尝试了几件事:
换句话说,即使我限制输入数据保持低于硬件功能并使用ram来保存项目,而BerkeleyDB需要一些时间来适应增长,因为这个时间越来越长,性能接近0.
这让我感到惊讶,因为我已经看到声称可以处理数TB的数据,但我的测试显示不然.我仍然希望我做错了什么......
编辑2:
在给出了一些更多的想法和Peter的输入之后,我现在明白随着文件变大,一批写入将分散得更远,并且它们落入同一磁盘柱的可能性下降,直到它最终达到搜索/磁盘的第二个限制.
但是BerkeleyDB的定期文件重组比这更早地杀死了性能,并且以更糟糕的方式:它只是停止响应更长和更长的时间,同时它会改变周围的东西.使用速度更快的磁盘或在不同磁盘之间传播数据库文件无济于事.我需要找到解决这些吞吐量漏洞的方法.
我想在Windows上使用perl BerkleyDB模块,但我没有设法做到这一点.
我知道这有很多问题,我在这里阅读了很多关于SO和其他来源的问题.但我找不到解决办法.
例如:在Windows 7(64位)上使用CPAN BerkeleyDB模块 但是没有答案.有一个64位补丁的提示,但链接被破坏.
Windows 7专业版
Perl 5.16
C:\> perl -v
This is perl 5, version 16, subversion 3 (v5.16.3) built for MSWin32-x64-multi-thread
(with 1 registered patch, see perl -V for more detail)
Copyright 1987-2012, Larry Wall
Binary build 1603 [296746] provided by ActiveState http://www.ActiveState.com
Built Mar 13 2013 13:31:10
Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the …在多线程应用程序中使用berkeley DB(bdb)句柄的最佳方法是什么?
让每个线程打开自己的句柄是否更好; 要么,
打开一个句柄并让每个线程执行txn_begin {} txn-> commit()更好吗?
哪一个更好?我正在使用带有DB_THREAD标志的Transactional Data Store.
谢谢
我试图理解在使用BerkeleyDB时应该选择哪种访问方法:B-Tree与HashTable.Hashtable提供O(1)查找,但插入是昂贵的(使用线性/可扩展散列我们得到分摊O(1)插入).但B-Trees提供log N(base B)查找和插入时间.B-Tree还可以支持范围查询并允许按排序顺序进行访问.
我很难在我的SSD上存储数亿个16/32字节的键/值对和一个哈希数组.
京都内阁:当它工作正常时,它以70000记录/秒的速度插入.一旦下降,它就会下降到10-500记录/秒.使用默认设置,在大约一百万条记录之后发生丢弃.查看文档,这是数组中默认的桶数,因此它是有意义的.我将这个数字增加到了2500万,事实上,它可以正常工作,直到大约2500万条记录.问题是,只要我将桶数推到3000万或以上,插入速率就会从一开始就降低到10-500条记录/秒.Kyoto Cabinet不是为了在创建数据库后增加存储桶数量而设计的,因此我无法插入超过2500万条记录.
1/一旦铲斗数超过25M,为什么KC的插入率会变得非常低?
使用Berkeley DB:我得到的最佳速度略低于KC,接近50000记录/秒,但仍然可以.使用默认设置,就像KC一样,在大约一百万条记录之后,速度会突然下降.我知道BDB旨在逐步扩展其桶数.无论如何,它试图增加初始数量,与HashNumElements和FillFactor一起玩,但是这些尝试都使情况变得更糟.所以我仍然无法使用DBD插入超过1-2百万条记录.我尝试激活非同步事务,尝试不同速率的检查点,增加缓存.什么都没有改善下降.
2/在1-2百万次插入后,什么可能导致BDB的插入率下降?
注意:我正在使用java,当速度下降时,CPU使用率降低到0-30%,而在正常速度下工作时,CPU使用率降低到100%.
注意:停止进程并恢复插入不会改变任何内容.所以我认为这与内存限制或垃圾收集无关.
谢谢.
Berkeley DB(JE)许可可能是交易杀手.我有一个Java应用程序转到一小部分客户,但由于它是一个桌面应用程序,我的价格不能支持单个实例许可.
是否有推荐的Java替代Berkeley DB? 商业或其他方面(良好的键值存储实现可以变得非常重要,我更愿意推迟其他地方的维护).我需要的不仅仅是一个哈希存储,因为我需要迭代后续的关键子集,基本的哈希存储将是O(m*n)搜索,我希望在桌面计算机上存储大约为50-60GiB.您可以推荐的任何人都可以将其后备存储保存在单个文件中吗?
我在使用BerkeleyDB时遇到了一些问题.我有多个相同代码的实例指向一个DB文件的存储库,一切运行正常5-32小时,然后突然出现死锁.在执行db_get或db_put或游标创建调用之前,该命令会提示停止.所以我只是想问一下处理这些调用的正确方法.这是我的总体布局:
这就是环境和数据库的创建方式:
my $env = new BerkeleyDB::Env ( 
   -Home   => "$dbFolder\\" , 
   -Flags  => DB_CREATE | DB_INIT_CDB | DB_INIT_MPOOL) 
   or die "cannot open environment: $BerkeleyDB::Error\n";
my $unsortedHash  = BerkeleyDB::Hash->new (
   -Filename => "$dbFolder/Unsorted.db", 
   -Flags => DB_CREATE,
   -Env  => $env
   ) or die "couldn't create: $!, $BerkeleyDB::Error.\n";
运行此代码的单个实例,转到站点并保存要由另一个实例解析的URL(我设置了标志,以便在锁定一个数据库时锁定每个数据库):
        $lk = $unsortedHash->cds_lock();
        while(@urlsToAdd){
            my $currUrl = shift @urlsToAdd;
            $unsortedHash->db_put($currUrl, '0');
        }
        $lk->cds_unlock();
它会定期检查一定数量的项目是否处于未排序状态:
$refer = $unsortedHash->db_stat();
$elements = $refer->{'hash_ndata'};
在向任何数据库添加任何元素之前,它首先检查所有数据库以查看该元素是否已存在:
if ($unsortedHash->db_get($search, $value) == 0){
    $value = "1:$value";
}elsif ($badHash->db_get($search, $value) == …由于BerkeleyDB可以使用SQLite api,因此python可以使用sqlite模块连接到BerkeleyDB.
这篇文章建议使用其他东西,但可能是在Api之前同步写的. Berkeley DB的最佳Python模块?
可以获得简单的连接字符串.如果有已知问题,请发帖.我正在探索这个话题.
在linux和windows上使用python 2.7.
我有一组1亿多个字符串,每个字符串长达63个字符.我有很多磁盘空间和很少的内存(512 MB).我需要单独查询存在,并且不存储其他元数据.
我事实上的解决方案是BDB btree.有没有更好的选择?我知道leveldb和Kyoto Cabinet,但不熟悉以确定优势.
berkeley-db ×10
java ×3
python ×3
database ×2
perl ×2
activestate ×1
b-tree ×1
bsddb ×1
deadlock ×1
hashmap ×1
hashtable ×1
key-value ×1
kyotocabinet ×1
leveldb ×1
nosql ×1
performance ×1
sqlite ×1
transactions ×1