轻量级解决方案,可保存一张包含数百万条记录的表



简介:我需要访问一个只有一列、一百万行、没有任何关系的简单表,只需要简单的6个字符的条目-邮政编码。我将使用它来检查用户输入的邮政编码,以确定它是否有效。这将是几个月的临时解决方案,直到我可以删除此验证并将其留给web服务。所以现在我正在寻求解决方案。

我所拥有的:

  • 基于Adobe CQ5构建的门户网站(Java、OSGi、Apache Sling、CRX)
  • 它所在的Linux环境
  • 这一百万行的纯文本文件(9mb)

我想要什么:

  • 只对一个数据进行快速访问(只读取,不写入)目的:查找具有特定值的行(长度为六个字符,仅包含拉丁符号和数字)
  • 尽可能容易地创建这个解决方案,即使用linux预装软件或能够快速安装和启动而无需长时间的设置和配置

目前,我有下一个选择:使用数据库或使用类似HashSet的东西来保存这一百万条记录。第一个解决方案需要额外的步骤来安装和配置数据库,当我想到HashSet中的数百万条记录时,第二个解决方案让我抓狂。所以现在我正在考虑尝试使用SQLite,但我想听听关于这个问题的一些建议。

非常感谢。

在内容存储库中存储

您可以将其存储在CQ5存储库中,以消除对sqlite的外部依赖。如果您这样做,我建议按层次结构构建存储,以限制对等节点的数量。例如,邮政编码EC4M 7RF将存储在:

/content/postcodes/e/c/4/m/ec4m7rf

这与您将在/home下看到的用户和组的方法类似。

如果您也需要,这种数据结构可能有助于自动完成。如果您键入ec,那么您可以通过请求以下内容来返回集合中邮政编码的所有可能的后续字符:

/content/postcodes/e/c.1.json

这将显示4(以及EC中任何其他邮政编码的下一个字符)。

您可以使用数字选择器控制深度:

/content/postcodes/e/c.2.json

这将分为两个级别,显示4M以及这些"区域"中的任何邮政编码。

使用布隆过滤器检查是否不存在此外,您是否考虑过使用Bloom Filter?bloom过滤器是一种节省空间的概率数据结构,它可以快速告诉您一个项目在集合中是否是,是否绝对不是。存在误报的可能性,但您可以在创建布隆过滤器期间控制概率与大小的权衡。不可能出现假阴性。

这里有一个教程演示了这个概念。

Guava提供并实现了易于使用的布隆过滤器。它将像hashset一样工作,但您可能不需要将整个数据集保存在内存中。

BloomFilter<Person> friends = BloomFilter.create(personFunnel, 500, 0.01);
for(Person friend : friendsList) {
  friends.put(friend);
}
// much later
if (friends.mightContain(dude)) {
  // the probability that dude reached this place if he isn't a friend is 1%
  // we might, for example, start asynchronously loading things for dude while we do a more expensive exact check
}

从本质上讲,布隆过滤器可以放在检查的前面,从而无需对肯定在集合中的项目进行检查。对于集合中可能(根据设置,准确率约99%)的项目,则进行检查以排除假阳性。

我会尝试使用redis内存数据库,它可以处理数百万个键/值对,并且加载或读取速度非常快。存在许多适用于所有语言的连接器。还有一个apache模块(mod_redis)

您说过这是一个临时解决方案/需求,那么您需要数据库吗?

您已经将其作为一个文本文件,为什么不将其作为程序的一部分加载到内存中呢?因为它只有9 MB(假设您的进程是持久的且始终驻留的),并且引用为数组或值表。

相关内容

最新更新