如何在 ZODB 中设置缓存大小?

How to set cache size in ZODB?

我使用以下代码建立 ZODB 连接:

connection = ZODB.connection('zodb/connect4_reinf.fs')
dbroot = connection.root()

如何设置 RAM 缓存大小?

来自 class 数据库的源代码:

  def __init__(self, storage,
             pool_size=7,
             pool_timeout=1<<31,
             cache_size=400,
             cache_size_bytes=0,
             historical_pool_size=3,
             historical_cache_size=1000,
             historical_cache_size_bytes=0,
             historical_timeout=300,
             database_name='unnamed',
             databases=None,
             xrefs=True,
             large_record_size=1<<24,
             **storage_args):

ZODB.connection定义如下:

def connection(*args, **kw):
    return DB(*args, **kw).open_then_close_db_when_connection_closes()

我会说

   connection = ZODB.connection('zodb/connect4_reinf.fs',
        cache_size=<your-cache-size>)

还有一个 cache_size_bytes 如果您希望限制以(估计的)字节为单位。 0 表示对此参数无限制。

关于cache_size和cache_size_bytes之间的联系 (我将此作为答案发布,因为为此目的评论有点短)

这一次,我们可以在picklecache.py中找到答案,又是在源码中。重命名后,它归结为以下几行(在方法 _sweep 中):

for value in self.ring:
    if self.non_ghost_count <= target and (self.total_estimated_size <= target_size_bytes or not target_size_bytes):
            break
    (delete some objects from the cache)

这里 targetconnectioncache_size,在对象数中,target_size_bytes 是传递给 connectioncache_size_bytes , 以字节为单位。所以简而言之,如果 cache_size_bytes 评估为 False(作为默认值 0,还有 None,等等...),只考虑对象的数量帐户。如果存在cache_size_bytes,则同时考虑cache_sizecache_size_bytes,并且必须满足两个条件,即必须将对象带入缓存时,如果添加将导致有超过 cache_size 个活动对象 超过 cache_size_bytes 字节(估计),一些对象将从缓存中删除以腾出更多可用空间。