【问题标题】:Perl caching library for large datasets?用于大型数据集的 Perl 缓存库?
【发布时间】:2011-11-22 20:51:16
【问题描述】:

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

  1. 一次缓存大约 200,000 条记录,平均每条记录大约 2 MB(因此,总缓存大小约为 400GB)

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

  3. 具有大小感知能力,因此当总存储量超过预设最大值时,它会自动删除最旧(根据上次访问时间)的记录

  4. 考虑到上述要求,尽可能快

目前我看过的库是 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 次。缓存能够同时存储来自给定站点的所有页面至关重要。 (否则每个页面都会被丢弃,然后为每个工具重新缓存,这比完全没有缓存更糟糕)

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

【问题讨论】:

    标签: perl caching


    【解决方案1】:

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

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

    【讨论】:

    • 如果我从头开始,这是一个很好的建议,但我确实需要一些我可以快速实施的东西来改进现有的应用程序。
    【解决方案2】:

    我建议使用Memcached 之类的东西,而不是使用自己实现缓存的模块。然后使用 Perl 绑定之一,例如 Cache::MemcachedCHI::Driver::MemcachedMemcached::Client 或其他可能。

    【讨论】:

    • 我查看了 Memcached,但看起来最大记录大小为 1MB。此外,它将所有内容都存储在内存中,这对于一次存储 100 GB 是不切实际的。
    猜你喜欢
    • 2015-05-02
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 2023-03-23
    • 2013-01-31
    • 2011-02-17
    • 2012-07-01
    • 2012-02-08
    相关资源
    最近更新 更多