2012-07-17 29 views
0

什麼是閱讀與DBMS風格的訪問模式文件的最佳方法的連續運行;我的意思是以下幾點:使用Linux capabilites讀取塊

  • 我知道之前我需要獲取的頁面偏移量。
  • 有很多連續的頁面。
  • 可能有小的不連續性。
  • 可能會有很長的不連續性。
  • 所有的偏移量都是有序的(不支持前進運動)。

這種偏移列表的示例: 1,2,3,4,5,6,7,8,1000,1001,1003,1004,1005,1010,1011,1012,31004,31005,31006 。

我是爲了使用以獲得最佳的性能,其策略有點糊塗了。

  • 難道我靠Linux的頁面經理?怎麼樣?會一直循環通過 偏移量並讀取1個塊嗎?
  • 公開賽O_DIRECT文件和管理我的自我,即:交替的長讀取,並尋求。在這種情況下,我應該禁用readahead嗎?
+0

'O_DIRECT'可以是非常難用,因爲你必須自己管理的對齊方式。 – Mysticial 2012-07-17 16:48:01

+2

您可以使用Linux'aio'或posix'aio'界面,並排列您的所有請求。司機應該能夠找出完成讀取的最佳方式。 – jxh 2012-07-17 17:10:14

+0

您是否嘗試過mmap,查看性能? – alinsoar 2012-07-17 17:51:42

回答

1

我不知道這是否是最終的「最佳」,但我可能會mmap()文件,然後使用madvise()嘗試迫使系統故障前頁面範圍。顯然,這還需要一點點計算的偏移名單,以確定連續範圍(好吧,它不會真的需要它,但是這將削減madvise()電話,並獲得一點點效率,如果有很多這樣的範圍) 。提前排除故障將取決於您在每個頁面/範圍上花費多少時間進行任何計算,因此需要進行一些測試/調整。你也可以使用madvise()來暗示你完成後不再需要一個範圍,所以它可能會碰到被釋放的下一個列表的前面。

+0

好吧我會嘗試mmap,但這意味着完全依靠操作系統來做正確的預讀和緩衝。我希望能夠手動做一些更智能的事情,因爲我可以組織我的操作。例如:read(fd,run1,..)lseek()read(fd,run2,..)lseek等。但是,這表明我禁用預讀,並決定自己什麼是一個小的不連續性(我更好地閱讀)從一個大(我應該尋求)。 – DED 2012-07-18 05:56:21