python Seek上的大文本

2024-10-01 17:38:46 发布

您现在位置:Python中文网/ 问答频道 /正文

其文件大小介于5到5 Gig之间。我用Python来阅读它们。我有字节偏移量方面的特定锚点,我可以seek并从这些文件中读取相应的数据(使用Python的fileapi)。在

我看到的问题是,对于相对较小的文件(<;5Gig),这种读取方法效果很好。但是,对于大得多的文件(>;20 gig),尤其是当file.seek函数需要更长的跳转(比如一次需要几百万字节),它(有时)需要几百毫秒才能完成。在

我的印象是文件中的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的使用情况,也没有看到有什么忙的。在


Tags: 文件数据方法lt字节timeseekcurrent
2条回答

一个很好的解决方法是组合来自OS模块os.open(在您的例子中是带有标志os.O_RDONLY)、os.lseekos.read的函数,这些函数处于低级I/O

在我的系统(Windows10,Python3.7)上,您的代码在不到10微秒的时间内一直运行,所以代码中没有明显的错误。在

注意:您应该使用^{}而不是time.time()来衡量性能。time.time()的粒度可能非常糟糕(“并非所有系统都提供比1秒更精确的时间”)。当与其他系统比较计时时,可能会得到奇怪的结果。在

我最好的猜测是seek会触发一些缓冲(read ahead)操作,这可能会很慢,这取决于您的系统。在

根据文件:

Binary files are buffered in fixed-size chunks; the size of the buffer is chosen using a heuristic trying to determine the underlying device’s “block size” and falling back on io.DEFAULT_BUFFER_SIZE. On many systems, the buffer will typically be 4096 or 8192 bytes long.

您可以尝试通过将参数buffering=0添加到open()来禁用缓冲,并检查这是否会产生影响:

open(filename, 'r+b', buffering=0)

相关问题 更多 >

    热门问题