我有一个大文件,每行有两个数字,按第二列排序。我制作了一个以第一列为键的列表字典。
我的代码看起来像
from collections import defaultdict
d = defaultdict(list)
for line in fin.readline():
vals = line.split()
d[vals[0]].append(vals[1])
process(d)
但是,输入文件太大,因此d
不适合内存。
为了解决这个问题,我原则上可以一次读取文件的块,但我需要在块之间进行重叠,这样process(d)
就不会错过任何东西。
在伪代码中,我可以执行以下操作。
- 阅读 100 行创建字典
d
。 - 处理字典
d
- 删除
d
目前为止不在最大值 10 以内的所有内容。 d
重复但确保我们在任何时候都没有超过 100 行的数据。
在 python 中有没有很好的方法来做到这一点?
更新。 问题的更多细节。我将d
在读取第二个成对文件时使用,如果取决于列表中有多少值与第一个值相关联的值在d
10 以内,我将在该文件中输出该对。第二个文件也按第二列排序。
假数据。 假设我们可以将 5 行数据放入内存中,并且我们需要值的重叠也为 5。
1 1
2 1
1 6
7 6
1 16
所以现在 d 是 {1:[1,6,16],2:[1],7:[6]}。
对于下一个块,我们只需要保留最后一个值(如 16-6 > 5)。所以我们会设置
d 为 {1:[16]} 并继续阅读接下来的4行。