【问题标题】:perl persistent bloom filterperl 持久布隆过滤器
【发布时间】:2016-01-28 08:53:55
【问题描述】:

我有一个运行多个 perl 工作进程的系统,所有这些进程都需要查找布隆过滤器。如果我使用标准的布隆过滤器 perl 模块(Bloom::Filter 或其他),每个子进程都需要添加到布隆过滤器中 有没有办法可以使用跨多个进程共享的布隆过滤器

我什至需要将数据持久化到磁盘,因为每次我重新启动系统时,我都可以重复使用bloomfilter数据

【问题讨论】:

  • 如果一个子进程更改过滤器,其他子进程是否应该立即看到更改?
  • 运行时过滤器不会有任何变化
  • 那么你要找的就是所谓的数据序列化。看看 Storable 模块。 metacpan.org/pod/Storable
  • 但这意味着数据将为每个子进程复制到内存中如果我在bloomfilter中有4000万条记录和50个子进程,那么内存消耗将是巨大的
  • 你是如何创建子进程的? fork 使用写时复制,因此如果您在分叉之前将数据加载到父进程中并且之后不修改它,那么所有子进程都应该可以访问它而不会占用您的内存。

标签: perl bloom-filter


【解决方案1】:

解决此问题的常用方法是将 Bloom 过滤器存储在共享数据存储中。支持这种工作负载的好系统是Redis。 Ruby 和 Java 有开源实现。

如果您只需要一个简单的 Bloom 过滤器,您可以自己用几行代码实现一个带有 Redis 驱动程序的过滤器(取自 one of my presentations):

简而言之:用 Perl 编写上面的两个方法,你就有了一个功能齐全的 Bloom 过滤器。要提高性能,请避免使用 pipelining 对每个 SETBIT 和 GETBIT 进行往返并计算 optimal number of hash functions。

基于 Java 的实现实现了每秒大约 250K 的插入和包含调用的吞吐量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 2011-09-22
    • 2023-04-09
    • 1970-01-01
    • 2018-12-16
    相关资源
    最近更新 更多