2012-03-06 16 views
4

3Dキューブデータを処理する必要があります。その要素の数は数十億になる可能性があります。私は、Windows上でそれほど多くのメモリを割り当てることができないことを理解しています。だから、私はディスクベースの操作をインプロセスデータベースで考えている。これを行うための良い方法はありますか?ブーストの何か?サイズが1,000,000,000の配列をC++で処理する方法は?

更新:最終的には、ブラウジング機能にプロットを付ける必要があります。

Update2:次の記事は、メモリマップファイルを使用した場合の良い解決策でした。私はそれを試み、再び更新するでしょう。 http://www.codeproject.com/Articles/26275/Using-memory-mapped-files-to-conserve-physical-mem

+1

された後、彼らは、あなたのRAMに収まるようまあ、Win7のProは、数よりも多い192ギガバイト、までサポート、私は思う:) –

+6

あなたのデータで何をしようとしているか説明してください。その多くの要素によって、あなたは達成しようとしていることを慎重に考える必要があります。実行するアルゴリズムによって適切なデータ構造が決定されます。たとえば、実際には1000x1000x1000のキューブについて話していると思っていますが、おそらくほとんどの要素が空になります。多分あなたはオクトツリーを望むでしょう。しかし、まったく異なるものが必要かもしれません。もっと情報が必要です。 –

+0

@AlanBaljeu私はあなたの推測が正しいと思います。しかし、立方体は別の密な次元を持つ画像です。だから私はそれほどの大きさを必要とし、すべての要素が同じように重要です。 –

答えて

4

おそらくデータをより効率的に保存することができますか(Bentleyの「Programming Pearls」を読んでください)、それは疎なデータですか?

メモリマップファイル(MMF)はあなたの友人で、他のメモリと同様にアクセスできるメモリにMMFのチャンクをマップすることができます。

CreateFileMappingMapViewOfFileを使用して、プロセスにチャンクをマッピングします。

+0

あなたの答えをありがとう。いいえ、まったくまばらではありません。別の密な次元の画像です。あなたは私にMMFに対処する方法の参考文献を教えてもらえますか?私は本当に簡単なライブラリがあることを願っていますので、配列のように使うことができます。 –

+0

@david:私の答えを編集しました。 – 0xC0000022L

+0

私はあなたの答えを直接使用していないが、私はメモリマップファイルを使用して解決策を見つけた。私に方向性を与えてくれてありがとう。 –

5

最初の最も基本的なステップは、データをチャンクに分割することです。チャンクのサイズは、必要に応じて決まります。一度に描画できる、またはジオメトリを構築できる、または圧縮に最適なサイズのチャンクです。

管理可能なチャンクで作業すると、即時のメモリの問題が回避されます。必要に応じてチャンクをストリーミングします(ロードとアンロード/保存)。

ロード/セーブ処理中に、圧縮および/またはソートのデータベースを含めることができます。 RLEやSQLite(座標とデータブロブを持つ単一のテーブル)のような単純なものでも、十分なスペースを節約できます。圧縮率を上げると、より大きなチャンクサイズで作業することができます。

使用状況によっては、チャンクをメモリ内に圧縮し、変更時に(または変更可能なときに)短時間だけ解凍することもできます。あなたのデータが読み込み専用であれば、それらをロードし、必要なときだけ解凍すると非常に便利です。

データを塊に分割することは、オクトツリーの非常に単純なフォームであり、ジオメトリの生成(キューブのマーチングなど)を分離したデータの塊(スレッド化を簡略化する)で実行できるようにすること、 /ロードプロセスが大幅に簡単になりました。

+0

また、私のデータは別の高密度の次元を持つ画像です。私はどのようにデータを断片に分解できるのかよくわかりません。うん、私もSQLiteを考えていた。私は本当に良いAPIがあることを本当に望んだ。ご回答有難うございます。 –

+0

あなたのデータが画像の場合、自然な前提は画像で分割することです。これは、スライスのコンテキストで動作します。データが3D近隣に依存する場合、それはやや複雑です。あなたがその質問の中でより詳細にデータを記述することができれば、あるいは小さなサンプルを与えるほうが助けになるかもしれません。 – ssube

+0

データが3D近隣に依存しています。ハイパースペクトル画像です。だから私は実際に画像で分割することはできません –

関連する問題