简介:我需要访问简单的表,只有一列,百万行,没有任何关系,只有6个字符的条目 - 邮政编码。我将使用它来检查用户输入的邮政编码,以确定它是否有效。这将是几个月的临时解决方案,直到我可以删除此验证并将其留给Web服务。所以现在我正在寻求解决方案。
我有什么:
我想要的是什么:
目前我有下一个选择:使用数据库或使用HashSet之类的东西来保存这些百万条记录。第一个解决方案需要额外的步骤来安装和配置数据库,当我考虑HashSet中的全部百万条记录时,第二个解决方案让我发疯。所以现在我正在考虑尝试使用SQLite,但我想听听有关这个问题的一些建议。
非常感谢。
答案 0 :(得分: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
这将显示两个级别,显示4
和M
以及这些“区域”中的所有邮政编码。
使用布隆过滤器检查不存在 另外,您考虑过使用Bloom Filter吗?布隆过滤器是一种节省空间的概率数据结构,可以快速告诉您项目中的项目是否绝对不是。可能存在误报,但您可以在创建布隆过滤器期间控制概率与大小权衡。没有假阴性的可能性。
有一个教程演示了here概念。
Guava提供了易于使用的implementation of the bloom filter和{{3}}。它将像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%)的项目,则进行检查以排除误报。
答案 1 :(得分:1)
我会尝试使用可以处理数百万个键/值对的redis内存数据库,并且可以快速加载或读取。所有语言都有许多连接器。并且还存在一个apache模块(mod_redis)
答案 2 :(得分:0)
你说这是一个临时解决方案/要求 - 所以你需要一个数据库吗?
你已经把它作为一个文本文件了 - 为什么不把它作为程序的一部分加载到内存中,因为它只有9 MB(假设你的进程是持久的并且总是驻留)并且引用为数组或只是一个值表。