快速保存和检索用于自动更正程序的python数据结构?
作者:互联网
因此,我用Python 2编写了一个自动完成和自动更正程序.我使用提到的方法编写了自动更正程序,该方法是Peter Norvig的博客中有关如何编写拼写检查器的link.
现在,我正在使用使用嵌套列表实现的特里数据结构.我正在使用特里,因为它可以给我所有以特定前缀开头的单词.在叶子处是一个带有该单词的元组,并且一个值表示单词的出现频率.例如,单词bad,bat,cat将是另存为
['b'['a'['d',('bad',4),'t',('bat',3)]],'c'['a'['t',('cat',4)]]]
其中4,3,4是单词使用次数或频率值.同样,我已经尝试了大约13万个英语词典的单词,并使用cPickle进行了存储.
现在,每次读取整个Trie大约需要3-4秒,问题是每次遇到一个单词时都必须增加频率值,然后需要再次保存更新的Trie.可以想象,这是一个很大的问题,每次需要等待3-4秒才能读取,然后又需要那么多时间来保存更新的trie.每次运行程序并保存它们时,我将需要执行很多更新操作.
是否有一种更快或更有效的方法来存储大型数据结构,该结构会反复更新?如何保存IDE和移动设备中自动更正程序的数据结构?检索这么快?我也对不同的方法持开放态度.
解决方法:
我想到了几件事.
1)分割数据.说使用26个文件,每个文件存储以特定字符开头的尝试.您可以对其进行改进,以便使用前缀.这样,您需要写入的数据量就更少了.
2)不要将所有内容反映到磁盘上.如果您需要执行很多操作,请在ram(memory)中进行操作,然后将其写下来.如果您担心数据丢失,可以在X一段时间后或在进行多次操作后检查计算点.
3)多线程.除非您的程序仅执行拼写检查,否则可能还需要执行其他操作.有一个单独的线程负责加载写入,因此它在处理磁盘IO时不会阻塞所有内容. python中的多线程有些棘手,但是可以做到.
4)自定义结构.序列化所花费的一部分时间是调用序列化功能.由于您拥有一本包含许多函数调用内容的字典.在理想情况下,您应该具有与磁盘表示形式完全匹配的内存表示形式.然后,您只需读取一个大字符串并将其放入自定义类中(并在需要时将该字符串写入磁盘).这有点高级,可能带来的好处不会那么大,特别是因为python在处理位时效率不高,但是如果您需要从中挤出最后一点速度,这就是方法.
标签:trie,autocorrect,autocomplete,pickle,python 来源: https://codeday.me/bug/20191118/2031339.html