在解决这个问题之后,似乎基于文件或磁盘的Map
实现可能是解决我在此处提到的问题的正确解决方案。精简版:
Map
实施为ConcurrentHashMap
。在工作中,(强烈)建议我使用SQLite解决此问题,但是在问了上一个问题之后,我认为数据库不是适合此工作的合适工具。所以- 让我知道这听起来是否疯狂
-我认为更好的解决方案是将其Map
存储在磁盘上。
坏主意:自己实施。更好的主意:使用别人的图书馆! 哪一个?
n
几天以前的条目。如果我必须手动执行此操作并不重要。易于使用。 如果我能在本周末之前完成这项工作,那就太好了。
更好的是:一天结束。这将是 非常,非常 巨大的,如果我能一个JAR添加到我的类路径,改变new ConcurrentHashMap<Foo, Bar>();
以new SomeDiskStoredMap<Foo, Bar>();
和完成。
良好的 可扩展性和性能。 最坏的情况:每天平均每秒每秒添加3次(平均)新条目。但是,插入操作并不总是那么顺利。(no inserts for an hour)
然后可能是(insert 10,000 objects at once)
。
Ehcache和Berkeley DB现在都看起来很合理。在任一方向上有什么特别的建议吗?
更新(首次发布后约4年…):请注意,在较新版本的ehcache中,缓存项的持久性仅在付费产品中可用。感谢@boday指出这一点。
ehcache很棒。它将为您提供在内存,磁盘或具有溢出到磁盘的内存中实现映射所需的灵活性。如果为java.util.Map使用这个非常简单的包装器,那么使用它就非常简单:
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import net.sf.ehcache.Cache;
import net.sf.ehcache.Element;
import org.apache.log4j.Logger;
import com.google.common.collect.Sets;
public class EhCacheMapAdapter<K,V> implements Map<K,V> {
@SuppressWarnings("unused")
private final static Logger logger = Logger
.getLogger(EhCacheMapAdapter.class);
public Cache ehCache;
public EhCacheMapAdapter(Cache ehCache) {
super();
this.ehCache = ehCache;
} // end constructor
@Override
public void clear() {
ehCache.removeAll();
} // end method
@Override
public boolean containsKey(Object key) {
return ehCache.isKeyInCache(key);
} // end method
@Override
public boolean containsValue(Object value) {
return ehCache.isValueInCache(value);
} // end method
@Override
public Set<Entry<K, V>> entrySet() {
throw new UnsupportedOperationException();
} // end method
@SuppressWarnings("unchecked")
@Override
public V get(Object key) {
if( key == null ) return null;
Element element = ehCache.get(key);
if( element == null ) return null;
return (V)element.getObjectValue();
} // end method
@Override
public boolean isEmpty() {
return ehCache.getSize() == 0;
} // end method
@SuppressWarnings("unchecked")
@Override
public Set<K> keySet() {
List<K> l = ehCache.getKeys();
return Sets.newHashSet(l);
} // end method
@SuppressWarnings("unchecked")
@Override
public V put(K key, V value) {
Object o = this.get(key);
if( o != null ) return (V)o;
Element e = new Element(key,value);
ehCache.put(e);
return null;
} // end method
@Override
public V remove(Object key) {
V retObj = null;
if( this.containsKey(key) ) {
retObj = this.get(key);
} // end if
ehCache.remove(key);
return retObj;
} // end method
@Override
public int size() {
return ehCache.getSize();
} // end method
@Override
public Collection<V> values() {
throw new UnsupportedOperationException();
} // end method
@Override
public void putAll(Map<? extends K, ? extends V> m) {
for( K key : m.keySet() ) {
this.put(key, m.get(key));
} // end for
} // end method
} // end class
可能重复: 替换python中的switch语句? 鉴于此方法: 我想让它成为一个开关大小写样式,但是Python不支持开关大小写。 有替代品吗?
这个问题已经过时了。删除了不推荐使用的标志,3.8确认了这一点。
问题内容: 这是一个从来没有一个正确答案的问题,我已经在网上搜索了很多次,却找不到解决方案。 它适用于Firefox,Chrome。我的responseText将像Réunion这样返回char,它将显示为奇怪的符号。 我尝试了许多方法,例如编码和解码,在响应文件中设置标头都无效。我没主意了。请帮助某人。 在主文件中,确保设置了内容类型和字符集。 在您的AJAX加载页面中,确保您位于顶部。 问题解
问题内容: 这是一个在大多数正则表达式实现中都能正常工作的正则表达式: 这与.js匹配以.js结尾的字符串,但filename.js除外 Javascript没有后面的正则表达式。有谁能放在一起实现相同结果并可以在javascript中工作的替代正则表达式? 这里有一些想法,但需要帮助功能。 问题答案: 为我工作 经过测试: test.js match blabla.js match filena
问题内容: 一个(很久以前),我写了一个网络蜘蛛,我对该线程进行了多线程处理,以使并发请求能够同时发生。那是我的Python青年时代,在我了解GIL及其为多线程代码造成的相关麻烦之前(IE,大多数时候,这些东西最终都被序列化了!)… 我想对这段代码进行重做,以使其更健壮并性能更好。基本上有两种方法可以执行此操作:我可以使用2.6+中的新多处理模块,也可以使用某种基于反应堆/事件的模型。我宁愿以后再
问题内容: 我执行了一个程序包管理器命令,将我们的项目更新为最新的二进制文件。我几乎发布了它,因为它通过了所有测试,直到幸运的是,我发现了一个需要更多调试的问题。 当我突然看到以下异常消息时,我的嘴张开了: 已达到“每小时6000个Redis请求”的免费配额限制。请访问https://servicestack.net升级到商业许可证。 如果我发布了该网站怎么办?这些做法简直令人反感!没有控制台警告