【发布时间】:2019-07-04 20:36:14
【问题描述】:
我有一些文本文件,其大小介于 5 gigs 和 50 gigs 之间。我正在使用 Python 来阅读它们。我在字节偏移方面有特定的锚点,我可以seek 并从每个文件中读取相应的数据(使用 Python 的file api)。
我看到的问题是,对于相对较小的文件( 20 gigs),尤其是当file.seek 函数必须进行更长的跳转(例如一次几百万字节)时,它(有时)需要几百毫秒才能完成这样做。
我的印象是文件中的查找操作是恒定时间操作。但显然,他们不是。有办法解决吗?
这是我正在做的事情:
import time
f = open(filename, 'r+b')
f.seek(209)
current = f.tell()
t1 = time.time()
next = f.seek(current + 1200000000)
t2 = time.time()
line = f.readline()
delta = t2 - t1
delta 变量间歇性地在几微秒到几百毫秒之间变化。我还分析了 cpu 的使用情况,也没有看到那里有什么忙。
【问题讨论】:
-
您确定是搜索本身,而不是后续读取需要更长时间吗?我同意你的观点,搜索本身基本上不需要任何时间。如果是读取而不是查找本身,那么我会查看读取背后的缓冲行为。 - 无论哪种情况,我认为您在文件中的位置都无关紧要。
-
你能提供一个minimal reproducible example吗?
-
例如:我正在读取文件为:
f=open(filename, 'r+b'); f.seek(100000000);,然后读取一行,如f.readline()。 -
啊,二进制模式,尽管您的问题提到了“文本文件”。但是在我的系统上以 100 MB 的步长寻找一个 2 GB 的文件需要几毫秒的时间。所以我猜这不是 Python 的东西。它可能是您的 Python 解释器的具体实现、您的操作系统/文件系统、病毒扫描程序?我可以想象(但这是猜测)搜索操作可能会在您的计算机上的某个级别上启动预读操作。只是为了争论,您可以在禁用病毒扫描程序的情况下尝试相同的测试,或者使用另一个文件系统上的文件,或者在 Python 中使用类似文件的对象?
-
正如@Steve 所建议的,它可能是读取本身,而不是搜索。从您评论中的代码中仍然不清楚这一点,这就是我要求minimal reproducible example 的另一个原因。你能说明你是如何测量时间的吗?