0

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

我有的:

  • 基于 Adob​​e CQ5(Java、OSGi、Apache Sling、CRX)构建的 Web 门户
  • 全部位于的Linux环境
  • 包含这百万行的纯文本文件 (9mb)

我想要的是:

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

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

非常感谢。

4

3 回答 3

3

存储在内容存储库中

您可以将其存储在 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

这将下降两个级别,向您显示这些“区域”中的 the4和 theM以及任何邮政编码。

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

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

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

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% 准确,具体取决于设置)的项目,进行检查以排除误报。

于 2013-08-21T12:46:24.500 回答
1

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

于 2013-08-21T14:17:10.857 回答
0

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

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

于 2013-08-22T14:40:02.223 回答