请查看以下代码(伪代码的种类):
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中检索更快。如何判断数据库+文件解决方案的性能?我的意思是,判断它至少“足够快”是否安全?
答案 0 :(得分:3)
这种加速背后的原因是什么?
它可能是操作系统的磁盘缓存。 http://en.wikipedia.org/wiki/Page_cache
一旦你从磁盘上读过一块文件,它就会在RAM中闲置一段时间。 RAM比磁盘快几个数量级,因此您可以看到读取大型文件的随机片段所需的时间差异很大。
或者,根据“db”的不同,数据库实现可能正在进行自己的缓存。
无论如何要控制它吗?
如果是磁盘缓存:
这取决于操作系统,但它通常是一个非常粗粒度的控件;例如,您可能被迫禁用整个卷的缓存,这会影响从该卷读取的系统上的其他进程,并会影响该卷上的所有其他文件。它也可能需要root / admin访问权限。
请参阅有关在Linux上禁用缓存的类似问题:Linux : Disabling File cache for a process?
根据您尝试执行的操作,您可以强制刷新磁盘缓存。这在您希望使用冷缓存运行测试的情况下非常有用,可让您了解最坏情况的性能。 (这也取决于您的操作系统,可能需要root / admin访问权限。)
如果是数据库:
取决于数据库。如果它是本地数据库,您可能只是看到磁盘缓存效应,或者数据库库可能正在执行自己的缓存。如果您正在与远程数据库通信,则可以在本地或远程(或两者)进行缓存。
可能有配置选项可以禁用或控制其中任何一层的缓存。