因此,我用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秒才能读取,然后又需要那么多时间来保存更新的特里。每当程序运行并保存它们时,我将需要执行很多更新操作。

是否有一种更快或更有效的方法来存储将重复更新的大型数据结构? IDE和移动设备中的自动更正程序的数据结构如何如此快速地保存和检索?我也对不同的方法持开放态度。

最佳答案

我想到了几件事。

1)分割数据。假设使用26个文件,每个文件存储以特定字符开头的尝试。您可以对其进行改进,以便使用前缀。这样,您需要写入的数据量就更少了。

2)不要将所有内容反射(reflect)到磁盘上。如果您需要执行很多操作,请在ram(memory)中进行操作,然后将其写下来。如果您担心数据丢失,可以在X一段时间后或在进行多次操作后检查计算点。

3)多线程。除非您的程序仅进行拼写检查,否则可能还需要执行其他操作。有一个单独的线程负责加载写入,以便在执行磁盘IO时不会阻塞所有内容。 python中的多线程有些棘手,但是可以做到。

4)自定义结构。序列化中花费的一部分时间是调用序列化功能。由于您拥有一本包含很多函数调用内容的字典。在理想情况下,您应该具有与磁盘表示形式完全匹配的内存表示形式。然后,您只需读取一个大字符串并将其放入自定义类中(并在需要时将该字符串写入磁盘)。这有点高级,可能带来的好处不会那么大,尤其是因为python在处理位时效率不高,但是如果您需要从中挤出最后一点速度,这就是方法。

关于python - 快速保存和检索用于自动更正程序的python数据结构?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36383284/

10-10 13:55
查看更多