2

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

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 中检索要快。如何判断我的数据库+文件解决方案的性能?我的意思是,判断它至少“足够快”是否安全?

4

1 回答 1

3

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

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

一旦你从磁盘读取了一个文件的一部分,它就会在 RAM 中停留一段时间。RAM 的速度比磁盘快几个数量级,因此您会看到读取大文件的随机片段所需的时间存在很大差异。

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

有没有办法控制它?

如果是磁盘缓存:

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

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

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

如果是数据库:

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

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

于 2013-10-27T03:12:43.660 回答