【发布时间】:2013-06-24 22:18:43
【问题描述】:
无法有效地反转(交换键的值和值的键)存储在文件中的大型 (2.8GB) 字典。效率是问题,我目前的解决方案是:
-
逐行读取字典文件(格式:,,,...)
对于每一行:
- 运行上一遍的in-progress输出文件,将其逐行复制到临时文件中
- 在适当的地方(按字母顺序)将字典值 (val1,val2,...) 插入到临时文件中,每个新值都是一个新键
- 用临时文件覆盖之前的pass输出文件
- 重复直到处理完所有字典行 (以格式结束::,,,.. :,,.. :,,,..)
这个算法非常笨拙,至少输出文件必须被写入 n^2 次(我认为...),其中 n 约为 30,000,000。缺乏可用内存会阻止整个读取它并在内存中处理它。
可能没有比让它继续下去更好的解决方案了,但如果有人有任何想法,我们将不胜感激。
编辑:应该明确最后输出的每一行都可以包含多个键作为值。
【问题讨论】:
-
您是否查看过
dbm和相关模块(gdbm、anydbm)? -
我很困惑。每个
<key>,<val1>,<val2>行是否应该代表原始字典中的一个键值对,其中键是row[0],值类似于tuple(row[1:])?您是想将row[1]: row[0], row[2]: row[0], …放入“倒置”字典中,还是将tuple(row[1:]): row[0]放入或其他不同的地方? -
@abarnert 是的,你的正确,第一行项目是键,后续项目是该键的值。
-
@senderle 不,我从未听说过它们,尽管它们看起来很有前途。
标签: python file dictionary