我正在制作一个粗糙的Java拼写检查器,该检查器包含一篇文章和一个预先排序的字典文件。文章的字词长度各不相同,因此,我尝试制作一个使用文件给出的字词的堆栈。
不幸的是,由于堆栈空间不足(即使使用缩短的字典文件),并且由于性能方面的考虑,我决定直接从文本文件中读取内容。
问题在于文件中没有相同长度的单词。由于单词的长度各不相同,因此我不能也不应期望单个单词的长度对确定字典文件中的单词数(从文件的大小)很有用。
因此,我被困住了。我需要对该文件执行二进制搜索,以使拼写检查程序正常工作。但是,如果没有明确的方法将文件视为数组,则无法执行二进制搜索,尤其是当数组太大而无法放入程序的内存中时。
我该怎么办?
答案 0 :(得分:1)
牛津英语词典建议您为词典考虑大约~250,000 words(不考虑仅用于特定领域的单词)。这对您来说是重要的设计信息。
我看到了一些解决方案:
1)只需使用HashSet<>
理论上,您可以将HashSet<>
用于此数量的元素(此SO post讨论了HashSet
s的理论极限以及其他详细信息)。
但是,这带来了(如您所观察到的)一些问题:
(在每次启动应用程序时)需要一些时间才能将其读入RAM
它吃光了RAM
当然,您可以增加JRE的堆大小,但是对此有一个自然的限制(@StvnBrkddll链接了一个SO post,在注释中对此进行了完美描述)
2)使用数据库
我会考虑将有效词存储在(关系)数据库中:
您无需在应用程序启动时加载所有内容
它在RAM上的重量不如选项(1)
它给您更多选择,如果您想更改应用程序以向用户建议类似的单词而没有错别字(例如,如果您使用PostgreSQL,则可以实现pg_trgm)
但是它有一些缺点: