这些年来我积累了大约 600GB 的字典,我决定清理它们并对其进行排序
首先,平均每个文件都非常大,大小从 500MB 到 9GB 不等。我想做的一个先决条件是我对每个字典进行排序。我的最终目标是完全删除所有字典文件中的重复单词。
这样做的原因是我的大多数字典都是按类别排序和组织的,但重复的仍然经常存在。
Load file
Read each line and put into data structure
Sort and remove any and all duplicate
Load next file and repeat
Once all files are individually unique, compare against eachother and remove duplicates
对于字典 D{1} 到 D{N}:
1) 分别对D{1}到D{N}进行排序。
2) 检查D{i}中每个单词的唯一性
3) 对于D{i}中的每个单词,检查D{i+1}到D{N}中的所有单词。如果在D{i}中唯一,则首先删除每个单词。
- 我正在考虑使用一种“哈希”来改进这个算法。可能只检查前一个或两个字符,因为列表将被排序(例如,以 a、b 等开头的单词的散列开始行位置)。
4) 保存并退出。
之前的示例(但要小得多):
Dictionary 1 Dictionary 2 Dictionary 3
]a 0u3TGNdB 2 KLOCK
all avisskriveri 4BZ32nKEMiqEaT7z
ast chorion 4BZ5
astn chowders bebotch
apiala chroma bebotch
apiales louts bebotch
avisskriveri lowlander chorion
avisskriverier namely PC-Based
avisskriverierne silking PC-Based
avisskriving underwater PC-Based
因此,它会看到 avisskriveri、chorion、bebotch 和 PC-Based 是在三个词典中的每一个内部和之间重复的单词。所以我首先在D{1}中看到 avisskriveri ,所以在我见过的所有其他实例中删除它。然后我首先在D{2}中看到绒毛膜,然后在所有其他实例中首先删除它,依此类推。在D{3}中,bebotch 和 PC-Based 被复制,所以我想删除它的一个条目(除非我以前见过它)。然后保存所有文件并关闭。
之后的示例:
Dictionary 1 Dictionary 2 Dictionary 3
]a 0u3TGNdB 2 KLOCK
all chorion 4BZ32nKEMiqEaT7z
ast chowders 4BZ5
astn chroma bebotch
apiala louts PC-Based
apiales lowlander
avisskriveri namely
avisskriverier silking
avisskriverierne underwater
avisskriving
请记住:我不想创建任何新字典,只删除所有字典中的重复项。
选项:
“散列”每个文件的唯一字数,允许程序估计计算时间。
指定一种方式,给出以所需第一个字母开头的第一个单词的位置。这样搜索可以“跳转”到一行并跳过不必要的计算时间。
在 GPU 上运行以进行高性能并行计算。(这是一个问题,因为从 GPU 中获取数据很棘手)
目标:减少计算时间和空间消耗,使该方法在能力有限的标准机器或服务器上负担得起。或者设备一种在 GPU 集群上远程运行它的方法。
tl;dr - 对数百个文件中的唯一单词进行排序,其中每个文件的大小为 1-9GB。