2

データのブロックをメモリに読み込み、以下に示す関数を使用してビッグエンディアンの整数を交換することで、大きなバイナリファイル(〜8Gb)を解析することができました。ただし、 Boost Memory-Mappedファイルを使用してパフォーマンスを向上させようとしていますが、ファイルが読み取り専用モードで開かれているため、endian_swap関数を使用できません。元のファイルを書き込まずにバイトを交換する効率的な方法はありますか?そうでない場合、パフォーマンスはI / Oオーバーヘッドの影響を受けますか?

inline void endian_swap(unsigned short int& x)
{
  x = (x>>8) |
    (x<<8);
}
inline void endian_swap(unsigned int& x)
{
  x = (x>>24) |
    ((x<<8) & 0x00FF0000) |
    ((x>>8) & 0x0000FF00) |
    (x<<24);
}
inline void endian_swap(unsigned long long int& x)
{
  x = (((unsigned long long int)(x) << 56) | \
      (((unsigned long long int)(x) << 40) & 0xff000000000000ULL) | \
      (((unsigned long long int)(x) << 24) & 0xff0000000000ULL) | \
      (((unsigned long long int)(x) << 8)  & 0xff00000000ULL) | \
      (((unsigned long long int)(x) >> 8)  & 0xff000000ULL) | \
      (((unsigned long long int)(x) >> 24) & 0xff0000ULL) | \
      (((unsigned long long int)(x) >> 40) & 0xff00ULL) | \
      ((unsigned long long int)(x)  >> 56));
}

コードはこの記事で見つかりました。お時間をいただき、誠にありがとうございます。

4

1 に答える 1

2

少なくとも、基盤となるオペレーティングシステムは、目的の動作をサポートしています。

   MAP_PRIVATE
              Create a private copy-on-write mapping.  Updates
              to the mapping are not visible to other processes
              mapping the same file, and are not carried through
              to the underlying file.  It is unspecified whether
              changes made to the file after the mmap() call are
              visible in the mapped region.

フラグは次のprivように変換されるようMAP_PRIVATEです:

void* data = 
    ::BOOST_IOSTREAMS_FD_MMAP( 
        const_cast<char*>(p.hint), 
        size_,
        readonly ? PROT_READ : (PROT_READ | PROT_WRITE),
        priv ? MAP_PRIVATE : MAP_SHARED,
        handle_, 
        p.offset );
if (data == MAP_FAILED)
    cleanup_and_throw("failed mapping file");
于 2011-07-03T01:30:33.163 に答える