关于随机文件读取的速度(Python)

关于随机文件读取的速度(Python),python,random-access,Python,Random Access,请看下面的代码(一种伪代码): 我使用数据库对.txt文件中文本段的位置和长度进行索引,以便进行随机检索 难怪,如果重复运行上述代码,执行所需的时间就会越来越少 1) 是什么导致了这种加速?是因为内存中的东西还是“缓存”之类的原因 2) 有没有办法控制它 3) 我比较了文本段存储在Berkeley DB中的其他方法,等等。当速度最快时,上面的代码比从Berkeley DB检索要快。如何判断数据库+文件解决方案的性能?我是说,判断它至少“足够快”安全吗 这一加速背后的原因是什么 它可能是操作系统的

请看下面的代码(一种伪代码):

我使用数据库对.txt文件中文本段的位置和长度进行索引,以便进行随机检索

难怪,如果重复运行上述代码,执行所需的时间就会越来越少

1) 是什么导致了这种加速?是因为内存中的东西还是“缓存”之类的原因

2) 有没有办法控制它

3) 我比较了文本段存储在Berkeley DB中的其他方法,等等。当速度最快时,上面的代码比从Berkeley DB检索要快。如何判断数据库+文件解决方案的性能?我是说,判断它至少“足够快”安全吗

这一加速背后的原因是什么

它可能是操作系统的磁盘缓存

一旦您从磁盘读取了一个文件块,它将在RAM中停留一段时间。RAM比磁盘快几个数量级,因此您将看到读取大文件的随机片段所需的时间有很大的变化

或者,根据“db”是什么,数据库实现可以自己进行缓存

有没有办法控制它

如果是磁盘缓存:

它取决于操作系统,但它通常是一个相当粗粒度的控件;例如,您可能被迫禁用整个卷的缓存,这将影响系统上从该卷读取的其他进程,并将影响该卷上的所有其他文件。它可能还需要root/admin访问权限

请参阅关于在Linux上禁用缓存的类似问题:

根据您尝试执行的操作,您可以强制刷新磁盘缓存。这在您希望使用冷缓存运行测试的情况下非常有用,让您了解最坏情况下的性能。(这也取决于您的操作系统,可能需要root/admin访问权限。)

如果是数据库:

取决于数据库。如果是本地数据库,您可能只是看到磁盘缓存效果,或者数据库库可能正在进行自己的缓存。如果您正在与远程数据库通信,则缓存可能在本地或远程进行(或两者都进行)


可能有一些配置选项可用于禁用或控制这两个层上的缓存。

谢谢您提供了非常有启发性的答案。请您看看我添加的问题(3)好吗?
index = db.open()
fh = open('somefile.txt','rb')
for i in range(1000):
    x = random_integer(1,5000)
    pos,length = index[x]
    fh.seek(pos)
    buffer = fh.read(length)

    doSomeThingWith(buffer)

fh.close()
db.close()