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

时间:2013-10-27 02:52:02

标签: python random-access

请查看以下代码(伪代码的种类):

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()

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

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

1)这次加速的原因是什么?是因为留在记忆中的东西还是“缓存”还是什么?

2)无论如何要控制它吗?

3)我已经将文本片段存储在Berkeley DB中的其他方法进行了比较,等等。在最快的时候,上面的代码比从Berkeley DB中检索更快。如何判断数据库+文件解决方案的性能?我的意思是,判断它至少“足够快”是否安全?

1 个答案:

答案 0 :(得分:3)

  

这种加速背后的原因是什么?

它可能是操作系统的磁盘缓存。 http://en.wikipedia.org/wiki/Page_cache

一旦你从磁盘上读过一块文件,它就会在RAM中闲置一段时间。 RAM比磁盘快几个数量级,因此您可以看到读取大型文件的随机片段所需的时间差异很大。

或者,根据“db”的不同,数据库实现可能正在进行自己的缓存。

  

无论如何要控制它吗?

如果是磁盘缓存:

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

请参阅有关在Linux上禁用缓存的类似问题:Linux : Disabling File cache for a process?

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

如果是数据库:

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

可能有配置选项可以禁用或控制其中任何一层的缓存。