【发布时间】:2011-11-22 20:51:16
【问题描述】:
我正在寻找一个 Perl 库来处理数据库查询的缓存,但它需要处理比典型应用程序大得多的缓存。它需要:
一次缓存大约 200,000 条记录,平均每条记录大约 2 MB(因此,总缓存大小约为 400GB)
没有最大记录大小(或至少一个相当大的,比如几 GB)
具有大小感知能力,因此当总存储量超过预设最大值时,它会自动删除最旧(根据上次访问时间)的记录
考虑到上述要求,尽可能快
目前我看过的库是 CHI 和 Cache::SizeAwareFileCache(Cache::Cache 的扩展)。
我对 CHI 的主要担忧是我需要在 is_size_aware 开启的情况下使用 CHI::Driver::File,但文档特别警告不要这样做:
...对于无法自动读取和更新值的驱动程序 - 例如,CHI::Driver::File - 在更新大小时存在竞争条件,这可能导致大小随着时间的推移变得不准确。
我对 Cache::SizeAwareFileCache 的主要关注是 Cache::Cache 是旧的,目前没有维护。我在文档中看到的第一件事是建议我改用 CHI 的部分。
有什么建议吗?我应该使用这两个库中的任何一个,还是其他什么?我是否因为想要为此使用缓存而疯狂?有没有人有类似要求的经验?如有任何建议,我将不胜感激。
有关应用程序的一些详细信息:
我有一个应用程序可以分析大型网站以查找 HTML 代码中难以发现的错误/效率低下,这些错误通常隐藏在数十万页中。该应用程序爬取整个网站并将每个页面的 HTML 代码存储在数据库中。 (一台运行在单独机器上的 MySQL 服务器)当爬取完成后,用户可以运行各种软件工具来分析站点上每个页面的 HTML。
工具在队列中等待,一次运行一个。每个工具都需要加载爬网中每个页面的 HTML,始终以相同的顺序。因此,如果抓取抓取了 100,000 个页面,并且用户需要在其上运行 15 种不同的工具,那么缓存需要保存至少 100,000 条记录,每条记录将被读取 15 次。缓存能够同时存储来自给定站点的所有页面至关重要。 (否则每个页面都会被丢弃,然后为每个工具重新缓存,这比完全没有缓存更糟糕)
最大的目标是减少数据库的负载。第二个(但仍然非常重要的)目标是提高速度。
【问题讨论】: