2013-10-27 74 views
2

請看看下面的代碼(種僞代碼):關於隨機文件的速度讀取(Python)的

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中獲取更快。我如何判斷我的數據庫+文件解決方案的性能?我的意思是,判斷它至少「足夠快」是否安全?

回答

3

背後是什麼和負責這個加速?

它可能是操作系統的磁盤緩存。 http://en.wikipedia.org/wiki/Page_cache

一旦你從磁盤讀取了一個文件塊,它就會在RAM中暫停一段時間。 RAM的速度比磁盤快幾個數量級,所以在讀取大文件的隨機碎片所花費的時間裏你會看到很多變化。

或者,根據「db」是什麼,數據庫實現可以做自己的緩存。

有無論如何去控制它嗎?

如果它是磁盤緩存:

這取決於操作系統上,但它通常是一個非常粗粒度的控制;例如,您可能會被迫禁用整個卷的緩存,這會影響系統上讀取該卷的其他進程,並且會影響該捲上的所有其他文件。它也可能需要root/admin訪問權限。

查看關於在Linux上禁用緩存此類似的問題:Linux : Disabling File cache for a process?

取決於你正在試圖做的,你可以強制刷新磁盤緩存中的內容。這在您想要使用冷藏緩存運行測試的情況下非常有用,可讓您瞭解最差情況下的性能。 (這還取決於您的操作系統,並且可能需要根/管理員權限。)

如果它的數據庫:

取決於數據庫。如果它是本地數據庫,則可能只是看到磁盤緩存效果,或者數據庫庫可能正在執行自己的緩存。如果您正在與遠程數據庫交談,緩存可能在本地或遠程(或兩者)發生。

可能有配置選項在這些層中的任一層上禁用或控制緩存。

+0

謝謝你的指導性答案。 – DingZh

+0

你能否看看我添加的問題(3)? – DingZh