2011-11-21 70 views
15

我花了一些時間研究我正在處理的應用程序的內存映射IO。我有一些非常大的(TB級)文件,我想將它們的片段映射到內存中,以便讀寫,最大限度地利用操作系統級緩存。我正在編寫的軟件需要在Unix/Linux和Windows下工作......性能至關重要。平臺無關的內存映射[文件] IO

我發現了boost::iostreams::mapped_file_sourceboost::iostreams::mapped_file_sink,它提供了我正在尋找的大部分設施。我想,但沒有發現這些設施有:

  • 強制寫入數據的磁盤同步(msync(2)在Unix; FlushViewOfFile在Windows上)
  • 鎖定文件,以防止兩個進程在創建時試圖寫在同一時間同一文件(或閱讀,而該文件仍然被寫入..)
  • 文件的控制屬性(UNIX)

可以用"boost/iostreams/device/mapped_file.hpp"這些東西我做的?是否有其他平臺獨立的庫可以更好地滿足我的要求?我必須開發自己的跨平臺庫來獲得這種靈活性嗎?

+0

順便說一句, 「存儲器映射的I/O」 通常指的是讀取使用地址(又名存儲器映射的)I/O端口(例如使用指針),而不是使用專用處理器I/O說明。 –

+0

公平點。我正在談論內存映射文件I/O [http://en.wikipedia.org/wiki/Memory-mapped_file] - 並且已經編輯了標題來反映這一點。 – aSteve

回答

3

看看boost :: interprocess和boost :: interprocess :: file_mapping。他們擁有你需要的一切。

boost::interprocess

boost::interprocess::file_mapping

+0

您可能是對的......但是,對於boost :: interprocess,我看不到我如何(直接)建立對操作系統頁面大小的數據塊的訪問... – aSteve

+0

@aSteve,這個庫支持內存映射文件,請參閱:http://www.boost.org/doc/libs/1_48_0/doc/html/interprocess/managed_memory_segments.html#interprocess.managed_memory_segments.managed_mapped_files – Nim

+0

是的,boost :: interprocess支持(託管)內存映射文件。 ..在這個上下文中「被管理」意味着文件中的空間被malloc()訪問爲「asf」。顯然對進程間通信很有價值,但我需要一個更基本的「非託管」? 「原始」IO的方法。我需要一個函數,它返回一個指向包含任意文件偏移量的映射塊的指針。 boost :: iostreams :: mapped_file_ *接口在這裏是理想的...雖然它們不提供同步/鎖定的相同靈活性。我讀過進程間文檔 - 我看不到如何使用進程間的「原始」映射IO。 – aSteve