次のような形式の N 個のファイルがあるとします。
1 つのファイルは次のよう
になります。
異なる ID を持つデータがある程度存在するたびに
- time 1:
- data with id: 10
- data with id: 13
- data with id: 4
- time 2:
- data with id: 10
- data with id: 77
...etc
(1 から 1000 までの ID を持つデータが、これらの N 個のファイルに何らかの方法(混合)で分散されるたびに)
これらの N 個のファイルをすべて結合して、順序付けされた単一のファイルを作成したいと思います。
最終ファイル:
- time 1:
- data with id: 1
- data with id: 2
- data with id: 3
- ...
- data with id: 1000
- time 2:
- data with id: 1
- data with id: 2
- data with id: 3
- ...
- data with id: 1000
...etc
データ ID 1 ~ 1000 のサイズは約 100 MB ですが、最大 50 GB のデータを占めることが多くあります。
この問題に対する私の解決策は、これを可能な限り高速にするために、これまでのところ次のようになります。
スーパーコンピューター ノード (たとえば、24 ~ 48 コアのコンピューター 1 台) でT スレッドを使用します (たとえば)。ID 1 ~ 1000 のすべてのデータを一度に保持するために、共有メモリ配列を割り当てました(必要に応じてそれ以上にすることもできます)。
手順:
ステップ 1:
- 各スレッドには、開いて所有するいくつかのファイルがあります。次に、各スレッドは、ファイル内にある ID のデータを共有配列に入力します。
ステップ2:
- すべてのスレッドが最終的に 1 回処理されると、スレッド 1 はこの配列を順序付けられた形式で最終ファイルに書き込みます。
アスダス
- それが効率的であれば、私は非常に興味がありますか?とにかく並列読み取りは順次化されていないので、まったく役に立ちませんか? 超高速 SSD を備えたローカル コンピューター、またはネットワーク ストレージ (Lustres または Panasas ファイルシステム) を備えたクラスター ノードで、最終的なファイルを計算できました。
- ステップ 2 ですべてのスレッドを再び使用してディスクに並列に書き込むことはできますか (オフセットによる並列書き込みをサポートする MPI IO を使用します)、または他にどのように達成できますか? -> C++ 標準ライブラリ?
ご意見ありがとうございます。