2011-11-21 9 views
15

Spędziłem trochę czasu pamięć bada odwzorowaną IO dla aplikacji pracuję nad. Mam bardzo duże pliki (w skali TB) i chcę je zmapować do pamięci, zarówno do odczytu, jak i zapisu, przy maksymalnym wykorzystaniu buforowania na poziomie systemu operacyjnego. Oprogramowanie, które piszę, musi działać pod kontrolą systemów Unix/Linux i Windows ... wydajność jest krytyczna.Platforma niezależny Zmapowane [file] IO

Odkryłem boost::iostreams::mapped_file_source i boost::iostreams::mapped_file_sink, które zapewniają większość udogodnień, których szukam. Obiekty, które chciałbym, ale nie znalazłem to:

  • Wymuszenie synchronizacji zapisanych danych na dysku (msync (2) na Unix; FlushViewOfFile Windows)
  • Blokowanie plików, aby zapobiec dwóch procesów próby zapisu do tego samego pliku w tym samym czasie (lub czytać, gdy plik jest nadal napisane ..)
  • Kontrolowanie atrybuty pliku podczas tworzenia (Unix)

mogę robić te rzeczy za pomocą "boost/iostreams/device/mapped_file.hpp" ? Czy istnieją inne niezależne od platformy biblioteki, które lepiej odpowiadają moim wymaganiom? Czy muszę opracować własną bibliotekę międzyplatformową, aby uzyskać tę elastyczność?

+0

okazji "Zmapowane I/O" na ogół odnosi się do czytania porty we/wy, przy użyciu adresów (czyli pamięci odwzorowanym) (na przykład za pomocą wskaźnika), a nie za pomocą szczególnego procesora i/O instrukcje. –

+0

Punkt targów. Mówię o pliku I/O odwzorowanym na pamięć [http://en.wikipedia.org/wiki/Memory-mapped_file] - i zredagowałem tytuł, aby to odzwierciedlić. – aSteve

Odpowiedz

3

Spójrz na boost :: interprocess i boost :: interprocess :: file_mapping. Mają wszystko, czego potrzebujesz.

boost::interprocess

boost::interprocess::file_mapping

+0

może masz rację ... ale z boost :: Interprocess, nie mogę zobaczyć, jak mogę (wprost) ustanowienie dostępu do danych OS-stronicowy wielkości kawałki ... – aSteve

+0

@aSteve, to biblioteka obsługuje pamięć odwzorowaną pliki patrz: 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

Tak, boost :: międzyprocesorowa podpory (zarządzanych) pamięci mapowane pliki. .. "managed" w tym kontekście oznacza, że ​​przestrzeń w pliku jest dostępna "jak gdyby" przez malloc(). Oczywiście cenne dla komunikacji międzyprocesowej, ale wymagam bardziej podstawowego "niezarządzanego?" podejście do "surowego" IO. Potrzebuję funkcji, która zwraca wskaźnik do zmapowanego bloku zawierającego dowolne przesunięcie pliku. Interfejsy boost :: iostreams :: mapped_file_ * są tutaj idealne ... choć nie oferują takiej samej elastyczności synchronizacji/blokowania. Czytałem dokumentację między procesami - nie widzę sposobu użycia interprocesowania dla "surowego" zmapowanego IO. – aSteve

Powiązane problemy