2011-11-22 69 views
2

我正在寻找一个Perl库来处理数据库查询的缓存,但它需要处理比典型应用程序更大的缓存。它需要:用于大型数据集的Perl缓存库?

  1. 缓存20万左右的记录一次,平均也许是两MB左右各(大约400GB左右,总缓存大小)

  2. 没有最大记录大小(或者至少相当大的一个,像几个GB)

  3. 是大小感知,所以当总储存得到上述预设的最大

  4. 以最快的速度自动删除的最后访问时间)记录的最古老的(在条件作为pos考虑到上述要求

我到目前为止看过的库是CHI和Cache :: SizeAwareFileCache(Cache :: Cache的扩展)。

主要担心我有CHI是,我需要使用CHI ::驱动程序::文件与is_size_aware打开,但文档明确警告不要这样:

...的驱动程序不能自动读取和更新值 - 例如,CHI :: Driver :: File - 更新大小时存在争用条件,可能导致大小随时间推移而变得不准确。

我对Cache :: SizeAwareFileCache所关心的主要问题是Cache :: Cache是​​旧的并且当前没有维护。我在文档中看到的第一件事就是建议我使用CHI来代替。

有什么建议吗?我应该使用这两个库中的任何一个,还是其他的?我是否因为想要使用缓存而疯狂?有没有人有类似要求的经验?我会很感激任何建议。

有关应用程序的一些细节:

我有一个分析大型网站的应用程序,以寻找在HTML代码中难以发现的错误/低效,往往埋成千上万的网页中。应用程序会抓取整个网站并将每个页面的HTML代码存储在数据库中。 (在独立机器上运行的MySQL服务器)爬网完成后,用户可以运行各种软件工具来分析网站上每个页面的HTML。

工具在队列中等待,并一次运行一个。每个工具都需要加载抓取中每个页面的HTML,并始终以相同的顺序。因此,如果抓取抓取100,000页,并且用户需要运行15个不同的工具,则缓存需要保存至少100,000条记录,每个记录将被读取15次。缓存能够同时存储来自给定站点的所有页面是至关重要的。 (否则每一页就会被放弃,然后再重新缓存的每个工具,这将是比没有缓存还要糟糕)

最大的目标是减少数据库的负载。次要(但仍然非常重要)的目标是提高速度。

回答

2

Perl比DB更适用于文件。如果您在200,000页内有400GB的HTML代码(即大约每个HTML文件2MB),而不是将400GB数据放在数据库上,再次读入缓存(最后再次写入磁盘),为什么磁盘上的HTML内容和数据库记录只与文件路径链接?

在拥有越来越多的“页面”和“工具”进行分析之后,您可能希望拥有更多的分析机器。高速缓存后无法保持400GB的数据库同步。保持数据库小巧高效,并将文件复制到每台分析机器的本地磁盘以便直接访问(尽可能快)。对于不具有依赖关系的不同工具并更新数据库记录上的不同字段,它们可以同时运行。对于具有依赖关系的工具,则直至您的工作流程设计。

+1

如果我从头开始,这是一个很好的建议,但我真的需要一些我可以快速实施以改进现有应用程序的东西。 – plasticinsect

1

而不是使用一个模块,它自己实现缓存我会建议使用像Memcached之类的东西。然后使用其中一个Perl Binding,如Cache::Memcached,CHI::Driver::Memcached,Memcached::Client或其他人。

+0

我看着Memcached,但它看起来最大的记录大小是1MB。另外,它将所有内容都存储在内存中,这对于一次存储100个GB来说并不实用。 – plasticinsect