建立具有许多键但简单值的持久只读字典的有效方法
Efficient way to set up a persistent read-only dictionary with many keys but simple values
我有大约 100k(相当短)的 unicode 字符串,每个字符串都有一个对应的整数。
我需要将它们存储在类似字典的持久对象中,然后仅供阅读访问。
我正在寻找一种解决方案,它不会填满加载整个结构的 ram,并且不会太贪婪地占用磁盘上的 space。
我已经尝试过 dbm and shelve,但我得到的结果文件超过 30Mb。
我确信有一些工具更适合这种特定情况,因此欢迎任何指点(针对 python2 或 python3)。
索引
您可能想建立一个索引。
数据库是一个文件,每个字符串在一行(或其他分隔符)中,数字在行尾。
字符串已排序。
你可以进行二进制搜索。
您可以使用合并排序来构建结构。将两个索引文件合并为一个。
费用:
O(n*log(n))
在创建期间写入每个映射
O(log(n))
搜索期间查找(很多搜索在旋转磁盘上花费很长时间)
O(max_string_length)
内存使用
我们在 Java 中为搜索引擎研讨会构建了这样的东西。它可以增长到千兆字节,但仍能快速响应。在这种情况下,它被称为 inverted index.
目录结构
您可以为该字符串创建一个目录,并在该目录中创建一个以数字作为名称的字符串。如果幸运的话,每个条目不会占用 4kb。我不知道。
我有大约 100k(相当短)的 unicode 字符串,每个字符串都有一个对应的整数。
我需要将它们存储在类似字典的持久对象中,然后仅供阅读访问。
我正在寻找一种解决方案,它不会填满加载整个结构的 ram,并且不会太贪婪地占用磁盘上的 space。
我已经尝试过 dbm and shelve,但我得到的结果文件超过 30Mb。
我确信有一些工具更适合这种特定情况,因此欢迎任何指点(针对 python2 或 python3)。
索引
您可能想建立一个索引。
数据库是一个文件,每个字符串在一行(或其他分隔符)中,数字在行尾。 字符串已排序。 你可以进行二进制搜索。 您可以使用合并排序来构建结构。将两个索引文件合并为一个。
费用:
O(n*log(n))
在创建期间写入每个映射
O(log(n))
搜索期间查找(很多搜索在旋转磁盘上花费很长时间)
O(max_string_length)
内存使用
我们在 Java 中为搜索引擎研讨会构建了这样的东西。它可以增长到千兆字节,但仍能快速响应。在这种情况下,它被称为 inverted index.
目录结构
您可以为该字符串创建一个目录,并在该目录中创建一个以数字作为名称的字符串。如果幸运的话,每个条目不会占用 4kb。我不知道。