スレッド間のメッセージ受け渡しを低レイテンシで実現する、ヘッダーのみのC++14製ロックフリー・リングバッファキュー。
greg7mdp/parallel-hashmap
標準の unordered/ordered コンテナを置き換えられる、高速でメモリ効率に優れたハッシュマップ、セット、B-tree コンテナを提供するヘッダーオンリーの C++ ライブラリ。
- スター
- 3,223
- フォーク
- 313
- 未解決の Issue
- 4
- 最終コミット
- 先月
これは何?
Parallel Hashmap(phmap)は、ハッシュマップとセットの実装に加え、std::map や std::set の代替となる B-tree ベースの順序付きコンテナを提供する C++ ライブラリです。ヘッダーオンリーなので、parallel_hashmap ディレクトリをプロジェクトにコピーしてインクルードするだけで使え、ビルド工程は必要ありません。ハッシュテーブルは std::unordered_map と std::unordered_set のドロップイン置き換えとして、B-tree は std::map と std::set の置き換えとして使えます。
ハッシュテーブルには値をメモリ配列に直接格納するクローズドハッシュ方式を採用し、間接参照を減らしています。ライブラリは Abseil の Swiss Table および B-tree の実装をベースにしたコードを採用しています。並列版ではテーブルを複数のサブマップに分割するため、リサイズ時のピークメモリを抑えられます。また、mutex 型を指定すれば内部ロックが有効になり、並行読み書きが可能です。
flat hash map は、格納する型が trivially copyable であれば、ディスクに単一配列としてダンプし、復元することもできます。前方宣言用ヘッダーも用意されており、異種型検索と C++11 から C++17 までの API をサポートしています。
主な機能
- 01ヘッダーオンリーで、インクルードパスを設定する以外にビルドは不要です。
- 02std::unordered_map、std::unordered_set、std::map、std::set のドロップイン置き換えとして使えます。
- 03並列ハッシュマップはテーブルをサブマップに分割し、必要に応じて内部ロックによる並行アクセスをサポートします。
- 04flat table は、trivially copyable な型であれば単一配列としてディスクにダンプし、復元できます。
- 05異種型検索と、try_emplace などを含む C++11 から C++17 までの API をサポートします。
ユースケース
- パフォーマンスが重要な C++ コードで std::unordered_map を置き換える。
- メモリ使用量を抑えながら、非常に多くのエントリーを格納する。
- 内部ロックを使い、複数スレッドでハッシュテーブルを共有するマルチスレッドサービスを構築する。
- 大規模な検索テーブルをバイナリ配列としてディスクにダンプし、高速に永続化する。
クイックスタート
- 1
parallel_hashmap ディレクトリをプロジェクトにコピーし、インクルードパスに追加します
- 2
CMake でテストとサンプルをビルドして実行します
cmake -DPHMAP_BUILD_TESTS=ON -DPHMAP_BUILD_EXAMPLES=ON -B build && cmake --build build && ctest --test-dir build
使う前に知っておきたいこと
- README では gtl プロジェクトへの移行を推奨しています。gtl には C++20 が必要で、今後の機能開発はそちらに移行します。
- フラットハッシュマップはメモリ内で値を移動するため、変更操作によって内部のポインターやイテレーターが無効になる場合があります。
- C++11 対応のヘッダーオンリーライブラリで、パッケージ化されたインストール方法はありません。ディレクトリを手動でコピーする必要があります。
トピック
よくある質問
- parallel-hashmap とは?
- 標準の unordered/ordered コンテナを置き換えられる、高速でメモリ効率に優れたハッシュマップ、セット、B-tree コンテナを提供するヘッダーオンリーの C++ ライブラリ。 Parallel Hashmap(phmap)は、ハッシュマップとセットの実装に加え、std::map や std::set の代替となる B-tree ベースの順序付きコンテナを提供する C++ ライブラリです。ヘッダーオンリーなので、parallel_hashmap ディレクトリをプロジェクトにコピーしてインクルードするだけで使え、ビルド工程は必要ありません。ハッシュテーブルは std::unordered_map と std::unordered_set のドロップイン置き換えとして、B-tree は std::map と std::set の置き換えとして使えます。
- parallel-hashmap は無料で使えますか?ライセンスは?
- parallel-hashmap は Apache-2.0 ライセンスのオープンソースです。商用製品で使う前にライセンス条件を確認してください。
- parallel-hashmap は今もメンテナンスされていますか?
- 半年以内に更新あり。parallel-hashmap の最終コミットは 2026年9月10日 です。
- parallel-hashmap は何に使えますか?
- パフォーマンスが重要な C++ コードで std::unordered_map を置き換える。 メモリ使用量を抑えながら、非常に多くのエントリーを格納する。 内部ロックを使い、複数スレッドでハッシュテーブルを共有するマルチスレッドサービスを構築する。 大規模な検索テーブルをバイナリ配列としてディスクにダンプし、高速に永続化する。
- parallel-hashmap のインストール方法は?
- parallel_hashmap ディレクトリをプロジェクトにコピーし、インクルードパスに追加します CMake でテストとサンプルをビルドして実行します: cmake -DPHMAP_BUILD_TESTS=ON -DPHMAP_BUILD_EXAMPLES=ON -B build && cmake --build build && ctest --test-dir build
- parallel-hashmap はどこで入手できますか?
- ソースコードとインストール手順は GitHub にあります:https://github.com/greg7mdp/parallel-hashmap
概要はプロジェクトの README をもとに AI が生成しています。GitHub の数値は毎日更新されます。
関連プロジェクト
ブロッキングソケットI/OでHTTP/HTTPSサーバーとクライアントを構築できる、C++11対応のシングルヘッダーライブラリ。
HTTP/WebSocketサービスを構築するための、高速で使いやすいFlask風C++マイクロフレームワーク。ヘッダーオンリーで利用できます。
文字列から float、double、整数値を高速かつ正確に解析する、from_chars互換のヘッダーオンリーC++ライブラリ。
C、C++、Python、Rust、JavaScript、Goなどに対応し、検索、ハッシュ、ソート、編集距離の計算をSIMDとSWARで高速化する文字列ライブラリ。
STL風の構文でJSONの解析、構築、操作、シリアライズができる、ヘッダーオンリーのC++11ライブラリ。