- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在测试 BerkeleyDB Java 版,以了解我是否可以在我的项目中使用它。
我创建了非常简单的程序,它与 com.sleepycat.je.Database 类的对象一起使用:
写入 N 条记录,每条记录 5-15kb,生成的键类似于 Integer.toString(random.nextInt());
读取这些记录,并按照创建的顺序使用 Database#get 方法获取它们;
使用 Database#get 方法以随机顺序读取相同数量的记录。
我现在看到了奇怪的事情。第三个测试的执行时间随着记录数量的增加呈非线性增长。
(当然,我已经运行了多次测试。)
我想我做错了什么。这是供引用的来源(抱歉,有点长),方法的调用顺序相同:
private Environment env;
private Database db;
private Random random = new Random();
private List<String> keys = new ArrayList<String>();
private int seed = 113;
public boolean dbOpen() {
EnvironmentConfig ec = new EnvironmentConfig();
DatabaseConfig dc = new DatabaseConfig();
ec.setAllowCreate(true);
dc.setAllowCreate(true);
env = new Environment(new File("mydbenv"), ec);
db = env.openDatabase(null, "moe", dc);
return true;
}
public int storeRecords(int i) {
int j;
long size = 0;
DatabaseEntry key = new DatabaseEntry();
DatabaseEntry val = new DatabaseEntry();
random.setSeed(seed);
for (j = 0; j < i; j++) {
String k = Long.toString(random.nextLong());
byte[] data = new byte[5000 + random.nextInt(10000)];
keys.add(k);
size += data.length;
random.nextBytes(data);
key.setData(k.getBytes());
val.setData(data);
db.put(null, key, val);
}
System.out.println("GENERATED SIZE: " + size);
return j;
}
public int fetchRecords(int i) {
int j, res;
DatabaseEntry key = new DatabaseEntry();
DatabaseEntry val = new DatabaseEntry();
random.setSeed(seed);
res = 0;
for (j = 0; j < i; j++) {
String k = Long.toString(random.nextLong());
byte[] data = new byte[5000 + random.nextInt(10000)];
random.nextBytes(data);
key.setData(k.getBytes());
db.get(null, key, val, null);
if (Arrays.equals(data, val.getData())) {
res++;
} else {
System.err.println("FETCH differs: " + j);
System.err.println(data.length + " " + val.getData().length);
}
}
return res;
}
public int fetchRandom(int i) {
DatabaseEntry key = new DatabaseEntry();
DatabaseEntry val = new DatabaseEntry();
for (int j = 0; j < i; j++) {
String k = keys.get(random.nextInt(keys.size()));
key.setData(k.getBytes());
db.get(null, key, val, null);
}
return i;
}
最佳答案
性能下降是非线性的,原因有两个:
请注意,您可以通过放弃一些持久性来提高写入性能:ec.setTxnWriteNoSync(true);
您可能还想尝试 Tupl,这是我一直在研究的开源 BerkeleyDB 替代品。它仍处于 alpha 阶段,但您可以在 SourceForge 上找到它。
为了公平比较 BDB-JE 和 Tupl,我将缓存大小设置为 500M,并在存储方法末尾执行显式检查点。
使用 BDB-JE:
使用 Tupl:
BDB-JE 由于其基于日志的格式,写入条目的速度更快。然而,Tupl 的阅读速度更快。这是 Tupl 测试的来源:
导入java.io。;导入java.util.;
导入 org.cojen.tupl.*;
公共(public)类TuplTest { 公共(public)静态无效主(最终字符串[] args)抛出异常{ 最终 RandTupl rt = new RandTupl(); rt.dbOpen(args[0]);
{
long start = System.currentTimeMillis();
rt.storeRecords(Integer.parseInt(args[1]));
long end = System.currentTimeMillis();
System.out.println("store duration: " + (end - start));
}
{
long start = System.currentTimeMillis();
rt.fetchRecords(Integer.parseInt(args[1]));
long end = System.currentTimeMillis();
System.out.println("fetch duration: " + (end - start));
}
}
private Database db;
private Index ix;
private Random random = new Random();
private List<String> keys = new ArrayList<String>();
private int seed = 113;
public boolean dbOpen(String home) throws Exception {
DatabaseConfig config = new DatabaseConfig();
config.baseFile(new File(home));
config.durabilityMode(DurabilityMode.NO_FLUSH);
config.minCacheSize(500000000);
db = Database.open(config);
ix = db.openIndex("moe");
return true;
}
public int storeRecords(int i) throws Exception {
int j;
long size = 0;
random.setSeed(seed);
for (j = 0; j < i; j++) {
String k = Long.toString(random.nextLong());
byte[] data = new byte[5000 + random.nextInt(10000)];
keys.add(k);
size += data.length;
random.nextBytes(data);
ix.store(null, k.getBytes(), data);
}
System.out.println("GENERATED SIZE: " + size);
db.checkpoint();
return j;
}
public int fetchRecords(int i) throws Exception {
int j, res;
random.setSeed(seed);
res = 0;
for (j = 0; j < i; j++) {
String k = Long.toString(random.nextLong());
byte[] data = new byte[5000 + random.nextInt(10000)];
random.nextBytes(data);
byte[] val = ix.load(null, k.getBytes());
if (Arrays.equals(data, val)) {
res++;
} else {
System.err.println("FETCH differs: " + j);
System.err.println(data.length + " " + val.length);
}
}
return res;
}
public int fetchRandom(int i) throws Exception {
for (int j = 0; j < i; j++) {
String k = keys.get(random.nextInt(keys.size()));
ix.load(null, k.getBytes());
}
return i;
}
}
关于java - BerkeleyDB JE 随机访问时间非线性增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11098085/
我正在玩一个开源项目Bim Server我查看了 git 中的代码。当 Bim 服务器启动时,它会创建 home/database 文件夹并在数据库文件夹内创建以下可用文件, lp:/media/is
BerkeleyDB数据库写操作过程中掉电失败,如何防止损坏? 丢失当前数据并不可怕。最主要的是已经存储的数据没有被破坏,并且在您恢复操作时可以快速访问它们。 因此,最大可能的记录速度。 提前致谢。
我正在尝试以每秒 50k 的插入速度向 BerkeleyDB 添加 3e9 个键(重复率低),复合记录由具有两个整数的结构组成。每个 key 的长度为 30。我使用的是 C API。 看来我必须将 c
我开始使用 BerkeleyDB。我写了下面的方法来向数据库中插入值: void Put(int key, int value){ DB *dbp; int ret; if((
我需要一个基于磁盘的键值存储,以维持大型数据集的高写入和读取性能。我知道,这是一项艰巨的任务。 我正在尝试使用 Java 中的 C BerkeleyDB (5.1.25) 库,但发现了严重的性能问题。
BerkeleyDB 的 C++ 实现可以合理支持的最佳并发级别是多少? 在吞吐量因资源争用而开始受到影响之前,我可以在数据库上敲击多少线程? 我已经阅读了手册并且知道如何设置锁的数量、储物柜、数据库
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我试图了解在使用 BerkeleyDB 时应该选择哪些访问方法:B 树与哈希表。哈希表提供 O(1) 查找,但插入成本很高(使用线性/可扩展哈希,我们可以为插入分摊 O(1))。但 B 树提供 log
在 Berkeley DB 中存储 CLOB(几百KB)的常用方法是什么? 最佳答案 Berkeley 数据库并不真正处理数据类型,它存储的是字节。因此,只需将字节存储在数据库中即可。 关于java
我正在测试 BerkeleyDB Java 版,以了解我是否可以在我的项目中使用它。 我创建了非常简单的程序,它与 com.sleepycat.je.Database 类的对象一起使用: 写入 N 条
在下面的程序中,我 打开BDB环境 打开数据库DB_BTREE/DB_CREATE 关闭数据库 以 DB_UNKNOWN/DB_RDONLY 身份重新打开数据库 ... 但它会引发段错误。 Progr
i am using berkeley DB JE 4.1.10i have use the secondary database concept and I want to insert 10,00
在 C++ 程序中,我尝试使用 Db::set_bt_function 成员函数(DB 作为 BTREE 类型打开)为 Berkeley DB 设置自定义比较函数。当我不更改比较函数时,我的代码工作正
我在 Perl 中使用 BerkeleyDB 和 DB_File。 如何将图像(小尺寸)存储为值? BerkeleyDB 是在数据库中存储图像的正确选择吗?与其他一些数据库系统不同,Berkeley
我正在尝试在 中插入 ~ 56,249,000 个项目berkeleydb-JE .我跑了数据库缓存大小 获取有关我的数据库的一些统计信息: java -jar je-5.0.34.jar DbCa
我想在 BerkeleyDB 中创建一个序列,我可以手动操作它,但我不知道该怎么做。我想要一个类似于 SQL 序列对象的东西。我在 API 文档中找到了一个类,但不清楚如何创建一个类。 非常感谢任何帮
我计划在 BerkeleyDB JE 中插入大量唯一键 (~3E9)数据库。 键的长度是固定的(~10 字节),但值的长度是可变的。数据库不会是事务性的。 您会为 EnvironmentConfig
我使用的是 Ubuntu 14.4 LTS。我正在尝试安装 openldap 2.4.42。我已经成功安装了先决条件组件:Cyrus-sasl.2.1.24、krb5-1.13.2、openssl-0
在 SortedMap 的文档中它提到以某种方式可以允许重复。但我不明白怎么办。有人可以给我举个例子吗?谢谢 最佳答案 当您创建 DataBase 对象时,在包含的 DataBaseConfig 上调
我在使用 BerkeleyDB 时遇到了一些问题。我有多个相同代码的实例指向一个数据库文件存储库,一切正常运行 5-32 小时,然后突然出现死锁。命令会在执行 db_get 或 db_put 或游标创
我是一名优秀的程序员,十分优秀!