我有一个大文件(6-60 GB),无法完全加载到内存中。 我可以逐行阅读它:
with open(...) as f:
for line in f:
# Do something with 'line'
但是有时候当我读到第n
行时,我也需要第n+2
行的信息。当我的“行”对象指向第n+2
行时,如何阅读第n
行?我仍然需要正常处理后面的行。
我担心是否使用f.readlines(10)
,因为我不知道我的前瞻尺寸(可能是99)。
我想到了一种方法,该方法是在列表中为每行具有查找和告诉的行指针,但我又担心存储空间。
我正在寻找读取此文件方面的所有其他方面的速度。有什么建议吗?
答案 0 :(得分:3)
您拥有行引用的想法很好,并且在存储时非常有效:整数代表每行。但是,在文件周围跳动并不是特别省时。
相反,我建议您有一个预读缓冲区。如果您在第n
行上,并且需要第n+2
行中的数据,那么请提前阅读这两行并将其保存在内存中。完成处理行n
。准备好进行下一行输入时,您已经在缓冲区中了。
读取优先级是(a)缓冲区; (b)从内存中提取下一行。
这个清晰程度足以让您进步吗?
答案 1 :(得分:2)
作为Prune回答的必然结果,队列可以很好地实现预读缓冲区或后向查看,请注意两个都保持恒定长度的队列可以为当前行提供一个很好的中间视图。 / p>
基本阅读该行,按入队列。 当堆栈达到一定大小时,从队列和进程中弹出,然后推入第二个队列。
当第二个队列达到给定大小时,将其弹出并忘记该行。
只要您需要浏览当前行,就可以通过访问任一队列中的值来向前或向后浏览。
所有这些实际上可以通过一个简单的列表来完成 https://docs.python.org/2/tutorial/datastructures.html
使用列表作为预读队列 _l.insert(0,line)插入一行 _l.pop()删除行并进行处理
或
_l.append(line)插入一行 _l.pop(0)删除并处理该行
在调用pop之前确保列表_l达到所需大小 现在,仅当您需要保留在内存中的行与您要处理的行接近时,该行才有效。