【发布时间】:2015-06-30 05:01:15
【问题描述】:
我正在处理一个非常大的文本文件 (tsv),大约有 2 亿个条目。其中一列是日期,记录按日期排序。现在我想从给定日期开始阅读记录。目前我只是从头开始阅读,这非常慢,因为我需要阅读近 100-1.5 亿条记录才能达到该记录。我在想如果我可以使用二进制搜索来加速它,我最多可以取消最多 28 个额外的记录读取(log(2 亿))。 python是否允许读取第n行而不缓存或读取它之前的行?
【问题讨论】:
-
除非你的行都有固定的长度,否则 Python 不会简单地知道一行是什么。它必须阅读所有内容才能找到表示行尾的
\n字符。除非您可以以某种方式计算行尾的字节偏移量,因为您的数据结构允许这样做,否则没有神奇的解决方法。 -
@deceze 是的,你是对的,python 无法知道'\n' 的存在。不幸的是,我当前的文件没有固定的行字节大小。为了将来的目的,我会记住这一点。知道行的字节大小后如何跳过行?
-
如果你必须这样做,可能值得将 tsv 转换为数据库(如 sqlite)并在感兴趣的列上放置索引。
-
@Naman 很难说。显然会有导入数据库的开销(每个文件一次)。一旦它进入数据库,我猜查询和提取至少与读取 tsv 一样快,但我不确定。您应该使用虚拟数据制作一个快速原型数据库以找出答案。
标签: python