我花了几个小时搜索如何使用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()
Run Code Online (Sandbox Code Playgroud)
有谁知道我在哪里可以找到更多(实用)如何使用这个包的例子?
或者有人会介意分享他们自己编写的使用它的代码吗?
编辑:
我之所以选择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 …Run Code Online (Sandbox Code Playgroud)在多线程应用程序中使用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";
Run Code Online (Sandbox Code Playgroud)
运行此代码的单个实例,转到站点并保存要由另一个实例解析的URL(我设置了标志,以便在锁定一个数据库时锁定每个数据库):
$lk = $unsortedHash->cds_lock();
while(@urlsToAdd){
my $currUrl = shift @urlsToAdd;
$unsortedHash->db_put($currUrl, '0');
}
$lk->cds_unlock();
Run Code Online (Sandbox Code Playgroud)
它会定期检查一定数量的项目是否处于未排序状态:
$refer = $unsortedHash->db_stat();
$elements = $refer->{'hash_ndata'};
Run Code Online (Sandbox Code Playgroud)
在向任何数据库添加任何元素之前,它首先检查所有数据库以查看该元素是否已存在:
if ($unsortedHash->db_get($search, $value) == 0){
$value = "1:$value";
}elsif ($badHash->db_get($search, $value) == …Run Code Online (Sandbox Code Playgroud) 由于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