我正在寻找能够解决的解决方案:
例如,MySQL模式将是这样的:
CREATE TABLE words (
id SERIAL,
word MEDIUMTEXT,
refcnt INT UNSIGNED,
INDEX(word(12)),
PRIMARY KEY (id)
)
这当然有效,但MySQL无法完成这项任务,并且由于搜索所需的索引,它会不必要地存储冗余信息。
在搜索最有效的解决方案期间,我发现了以下内容: - 因为这些词有很多共同点(大多数是各种语言和字符集中的普通字典词),所以:http://www.unixuser.org/~euske/doc/tcdb/index.html会很好 - 迄今为止我能找到的最好的东京内阁的TDB:packages.python.org/tokyocabinet-python/TDB.html,但我必须评估它的性能和可能的设置(在哪里存储什么,并使用什么样的索引在哪里以获得最佳时间和空间效率)
任何想法,算法,更好的,随时可用的产品和设置?
谢谢,
答案 0 :(得分:2)
您可能想要try Redis。它涵盖了大多数(如果不是全部) 你的要求。它具有良好的性能,适用于您的用例,具有原子性 用于创建引用计数和唯一标识符的递增/递减, many languages including Python and C存在客户端,您可以进行换行 事务中的命令序列。它还支持列表,集合和排序 设置和其他一些您可能会觉得有用的功能。
如果您可以对工作进行分区,则可以从多个数据加载/处理数据
主机并行。鉴于redis的速度,您可能不需要批量处理
但这是可能的(MSET
命令)。
另一个不错的方面是您可以使用命令行与Redis进行交互
redis-cli
命令。这样你就可以试用/调试序列了
尝试编写任何代码之前的命令。假设redis正在运行
localhost,使用默认端口,键入:
% redis-cli
redis>
我写了一组支持你的用例的快速命令。
此代码段创建一个名为next.words.id
的整数键,并将其递增
原子地,返回新值。为了便于说明,我在123455
开始了序列。 (integer) 123456
是值
退回给你的客户:
redis> SET next.words.id 123455
OK
redis> INCR next.words.id
(integer) 123456
然后我们将单词映射到其ID "chaos" -> 123456
,然后创建一个反向
从id:123456 -> "chaos"
映射,最后创建引用计数键
设为0
。前缀id:
和ref:
以及next.words.id
只是
我选择的约定 - 你可以使用你喜欢的任何命名。
redis> SET chaos 123456
OK
redis> SET id:123456 chaos
OK
redis> SET ref:chaos 0
OK
增加单词“chaos”的引用计数:
redis> INCR ref:chaos
(integer) 1
redis> INCR ref:chaos
(integer) 2
要减少引用计数,请使用DECR:
redis> DECR ref:chaos
(integer) 1
redis> DECR ref:chaos
(integer) 0
此时您的代码可以检测到“ chaos ”的引用计数
0
并在单个事务中执行以下命令:删除
单词及其id:
和ref:
键。我使用WATCH
命令来避免竞争条件:如果任何其他客户端在我们的事务提交之前更改了ref:chaos
密钥,它将被中止。
redis> WATCH ref:chaos
OK
redis> GET chaos
(integer) 123456
redis> MULTI
redis> DEL chaos
QUEUED
redis> DEL id:123456
QUEUED
redis> DEL ref:chaos
QUEUED
redis> EXEC
1) (integer) 1
2) (integer) 1
3) (integer) 1
希望这有帮助。