2011-11-21 11 views
15

私が取り組んでいるアプリケーションのメモリマップされたIOを調べるのに時間を費やしました。私はいくつかの非常に大きな(TBスケール)ファイルを持っており、読み書きのためにそれらからセグメントをメモリにマップして、OSレベルのキャッシュを最大限に活用したいと考えています。私が書いているソフトウェアは、Unix/LinuxとWindowsの下で動作する必要があります...パフォーマンスは重要です。プラットフォームに依存しないメモリマップ[ファイル] IO

私が探している施設のほとんどを提供するboost::iostreams::mapped_file_sourceboost::iostreams::mapped_file_sinkが見つかりました。私が好きな、しかし、発見していない施設は以下のとおりです。

  • ディスクに書き込まれたデータの同期を強制(msync(2)Unixでは、Windows上FlushViewOfFile)二つのプロセスを防ぐために、ファイルの
  • ロック同時に同じファイルを書き込もうとする(または読み取りファイルはまだ書かれている間...)
  • ファイルの属性を制御する作成時に(UNIX)

私は"boost/iostreams/device/mapped_file.hpp"を使用してこれらのことを行うことができます?私の要件に適した他のプラットフォームに依存しないライブラリはありますか?この柔軟性を得るには、私自身のクロスプラットフォームライブラリを開発する必要がありますか?

+0

ところで、 "I/Oメモリマップ" は、一般のI /(ポインタを使用してなど)のアドレス(メモリマップ別名)を使用してではなく、特殊なプロセッサを使用してI/Oポートを読み出すことをいいます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で、私は(直接的に)OSページサイズのチャンク内のデータへのアクセスを確立することができません。 – 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()によって "あたかも"としてアクセスされることを意味します。プロセス間通信には明らかに価値がありますが、私はより基本的な「管理されていない」必要があります。 "生の" IOのアプローチ。任意のファイルオフセットを含むマップされたブロックへのポインタを返す関数が必要です。 boost :: iostreams :: mapped_file_ *インターフェースは理想的ですが、同期/ロックに同じ柔軟性はありません。私はプロセス間のドキュメントを読んだことがあります - 私は "生の"マップされたIOのためのプロセスを使用する方法を見ることができません。 – aSteve

関連する問題