在我目前的一个侧面项目中,我正在扫描一些文本,查看三元组词的频率.在我第一次使用它时,我使用了三级深度的默认字典.换句话说,topDict[word1][word2][word3]返回这些单词在文本中出现的次数,topDict[word1][word2]返回包含单词1和2后面出现的所有单词的字典等.
这功能正常,但内存非常密集.在我的初始测试中,它使用了将三元组存储在文本文件中的内存的20倍,这看起来像是一个过大的内存开销.
我怀疑这些词典中的许多都是使用比实际使用的更多的插槽创建的,所以我想用这种方式使用更高效的内存来替换字典.我强烈希望有一种解决方案,允许按字典的方式进行键查找.
根据我所知的数据结构,使用红黑或AVL之类的平衡二叉搜索树可能是理想的,但我真的不想自己实现它们.如果可能的话,我宁愿坚持使用标准的python库,但如果它们最好的话,我肯定会接受其他选择.
那么,有没有人对我有任何建议?
编辑添加:
感谢到目前为止的回复.到目前为止,一些答案建议使用元组,当我将前两个单词浓缩为元组时,这对我来说并没有什么作用.我很犹豫要把所有这三个用作关键因为我希望它能够很容易地查找前两个字的所有第三个字.(即我想要的结果topDict[word1, word2].keys()).
我正在玩的当前数据集是维基百科学校的最新版本.例如,对于文本文件,解析前几千页的结果类似于11MB,其中每行是三个单词并且计数所有选项卡分开.以我现在使用的字典格式存储文本大约需要185MB.我知道指针和诸如此类的东西会有一些额外的开销,但差异似乎过大.
我需要优化应用程序的RAM使用率.
请不要在讲课时告诉我在编写Python时我不应该关心内存.我有一个内存问题,因为我使用非常大的默认字典(是的,我也想要快速).我目前的内存消耗是350MB并且还在增长.我已经不能使用共享主机了,如果我的Apache打开更多进程,内存会翻倍并增加三倍......而且价格昂贵.
我做了大量的分析,我确切地知道我的问题在哪里.
我有几个带有Unicode密钥的大型(> 100K条目)词典.字典从140字节开始并且增长很快,但更大的问题是密钥.Python优化了内存中的字符串(或者我已经读过),因此查找可以进行ID比较('实际').不确定这对于unicode字符串也是如此(我无法'实习'它们).
存储在字典中的对象是元组列表(an_object,int,int).
my_big_dict [some_unicode_string] .append((my_object,an_int,another_int))
我已经发现拆分到几个字典是值得的,因为元组占用了大量的空间......
我发现在使用它们作为键之前我可以通过散列字符串来节省RAM!但是,遗憾的是,我遇到了32位系统的生日碰撞.(附带问题:我可以在32位系统上使用64位密钥字典吗?)
Linux(生产)和Windows上的Python 2.6.5.有关优化字典/列表/元组的内存使用的任何提示?我甚至想过使用C - 我不在乎这段很小的代码是否丑陋.这只是一个独特的位置.
提前致谢!
当我做了一点测试时,一个python dict的int => int(不同值)的3000万个项目可以很容易地在我的mac上吃掉> 2G的内存.由于我只使用int到int dict,有没有比使用python dict更好的解决方案?
我需要的一些要求是,
更新,4.通过给定的键轻松获取子集,例如d.fromkeys([...])
谢谢.