- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在测试 mapdb 时遇到内存不足错误。鉴于该项目的整个想法是将数据结构序列化到磁盘并避免内存问题,我认为我做错了什么。有什么想法我做错了吗?还是有bug?
@Test
public void testLarge() throws Exception {
final HTreeMap<UUID, String> storage = DBMaker.newTempHashMap();
String string = createDataSize(250);
ArrayList<UUID> keys = new ArrayList<>();
for (int i = 0; i < 320000; i++) {
final UUID key = UUID.randomUUID();
storage.put(key, string);
keys.add(key);
}
for (UUID key : keys) {
assertNotNull(storage.get(key));
}
for (UUID key : keys) {
storage.remove(key);
}
assertEquals("nothing left", 0, storage.size());
}
/**
* Creates a message of size @msgSize in KB.
*/
private static String createDataSize(int msgSize) {
// Java chars are 2 bytes
msgSize = msgSize / 2;
msgSize = msgSize * 1024;
StringBuilder sb = new StringBuilder(msgSize);
for (int i = 0; i < msgSize; i++) {
sb.append('a');
}
return sb.toString();
}
}
堆栈跟踪。我的函数中的第 29 行对应于“assertNotNull(storage.get(key));”线。
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2367)
at java.lang.String.<init>(String.java:168)
at org.mapdb.SerializerBase.deserializeString(SerializerBase.java:724)
at org.mapdb.SerializerBase.deserialize(SerializerBase.java:932)
at org.mapdb.SerializerBase.deserialize(SerializerBase.java:731)
at org.mapdb.HTreeMap$1.deserialize(HTreeMap.java:134)
at org.mapdb.HTreeMap$1.deserialize(HTreeMap.java:123)
at org.mapdb.StorageDirect.recordGet2(StorageDirect.java:536)
at org.mapdb.StorageDirect.get(StorageDirect.java:201)
at org.mapdb.EngineWrapper.get(EngineWrapper.java:50)
at org.mapdb.AsyncWriteEngine.get(AsyncWriteEngine.java:163)
at org.mapdb.EngineWrapper.get(EngineWrapper.java:50)
at org.mapdb.CacheHashTable.get(CacheHashTable.java:85)
at org.mapdb.HTreeMap.get(HTreeMap.java:387)
at com.sample.StorageTest.testLarge(StorageTest.java:29)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:69)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:48)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.runners.ParentRunner.run(ParentRunner.java:292)
根据 unholysampler 的建议,我进行了以下更改,解决了问题。
diff -r 35918e46551a src/test/java/com/sample/StorageTest.java
--- a/src/test/java/com/sample/StorageTest.java Thu Mar 21 13:40:16 2013 -0600
+++ b/src/test/java/com/sample/StorageTest.java Thu Mar 21 13:42:24 2013 -0600
@@ -16,7 +16,9 @@
@Test
public void testLarge() throws Exception {
- final HTreeMap<UUID, String> storage = DBMaker.newTempHashMap();
+ File tmpFile = File.createTempFile("largeTest", null);
+ DB db = DBMaker.newFileDB(tmpFile).deleteFilesAfterClose().journalDisable().make();
+ final HTreeMap<UUID, String> storage = db.getHashMap("name");
String string = createDataSize(250);
@@ -25,6 +27,9 @@
final UUID key = UUID.randomUUID();
storage.put(key, string);
keys.add(key);
+ if (i%100==0) {
+ db.commit();
+ }
}
for (UUID key : keys) {
最佳答案
文档显示有一个 commit()
方法。
db.commit(); //persist changes into disk
testLarge()
从未调用 commit()
,因此尚未保留任何内容。
您也没有调用 close()
,因此当您移动到另一个测试时, map 可能仍在内存中。
注意:我从未与该库合作过,但这是我最好的猜测。
关于java - mapdb 内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15555160/
我正在探索将 MapDB 实用程序用作由 SSD 支持的堆外 Java 缓存。有人可以建议它是否支持以下内容: 设备对 SSD 设备的访问是否“闪存友好”,即访问是否对齐页面。 它是否允许以批处理模式
我正在研究堆外缓存,似乎找不到太多有关堆上内存消耗与堆外(仍在内存中)内存消耗的信息/基准。 我打算使用MapDB 。文档表明 compression can be applied在序列化对象和/或整
我在测试 mapdb 时遇到内存不足错误。鉴于该项目的整个想法是将数据结构序列化到磁盘并避免内存问题,我认为我做错了什么。有什么想法我做错了吗?还是有bug? @Test public
我在 Android Studio 中编程。我正在使用 mapDB,2.0-beta8 版本。我创建了自己的类 SingleCase,我还定义了一个静态变量: static ConcurrentNav
我正在使用我创建的文件支持的 MapDB: File dbFile = new File("db"); DBMaker.newFileDB(dbFile) .closeOnJvmShutdow
最新版本的 MapDB 是线程安全的吗?我在 Google 和 their website 找不到任何具体内容没有说任何关于锁定的事情。 最佳答案 你可以看到你需要的数据结构的代码注释,像HTreeM
什么时候应该通过 ORM 使用 MapDb 与常规数据库?除了直接映射到 Java.util.Map 之外,还可以使用 ORM 实现。 最佳答案 Jan 的回答有很大的偏见,因为他是 MapDb 的作
所以我有一个包含大约 2000 万个键值对的列表,我将数据以不同的方式存储在几个 MapDB 中,以查看它如何影响我的程序性能,并进行实验。 问题是,将 2000 万个键值对插入(以随机顺序)到 ma
我有一个用例,我想使用不透明的 byte[] 作为 MapDb 的键。我发现了这个 - Using a byte array as Map key - 快速限制;想知道推荐哪种方法。 我宁愿不创建一堆
所以我创建了一个像这样工作的数据库: static class Record implements Serializable { final String action; final
我正在使用 MapDB在一个处理数十亿个需要映射/排队的对象的项目中。程序完成后我不需要任何类型的持久性(MapDB 数据库都是临时的)。我希望程序尽可能快地运行,但我对 MapDB 的 commit
我将 MapDB 用于键值数据库以获得更好的性能。在 map.clear() 之后我的文件没有在磁盘中删除。我需要在 remove() 或 clear() 方法之后回收磁盘空间。下面是我的代码片段。
我在mapdb 中有包含150K 条目的树形图。调用 treemap.clear() 需要几分钟时间。我怎样才能快速做到这一点?使用 创建新的 db.treeMap("pageCache").crea
我正在使用 gwt,并且正在使用 mapdb,当我将数据检索为 map (BTreeMap) 时,gwt 会抛出 rpc 序列化异常。我将 map 包装在一个实现 Serialized 和 IsSer
我已经创建了一个 neo4j 用户定义过程。它还可以在 neo4j 中编译和工作。 虽然最近,我向我的过程插件添加了一个依赖项,以防止 neo4j 在我尝试运行新构建的 jar 时启动。具体来说,我在
我正在尝试序列化和反序列化一个对象以将其存储在 mapDb 中。 我设法使用这个片段序列化对象: ByteArrayOutputStream bos = new ByteArrayOutputStre
我已经实现了一个 hazelcast 服务,该服务通过 MapStoreFactory 和 newMapLoader 将其数据存储到本地 mapdb 实例中。如果需要重新启动集群,可以通过这种方式加载
我尝试直接将 Clojure 的 hashmap 与 MapDB 一起使用,但遇到了奇怪的行为。我检查了 Clojure 和 MapDB 源代码,但无法理解这个问题。 首先一切看起来都很好: lein
在 MapDB 1.x 中,您可以通过调用 db.delete("table name") 和 db.rename("old table name", "新表名”)。但是似乎不再有 API 功能可以执
我想直接从 HDFS 访问 mapdb map ,而不是将其复制到本地文件系统。是否可以?有没有其他方法可以在不使用本地文件系统的情况下读取这些 map ? 最佳答案 您可以将数据读入 byte[],
我是一名优秀的程序员,十分优秀!