私は画像処理に関するプログラムを書いています。480000列と480000行のサイズのint正方行列を格納する必要があります。どうすればそれができますか?
5 に答える
480,000 x 480,000 のマトリックスは使用しないでください。
この完全な行列を保持する唯一の理由は (スパースでないことを前提として)、ランダム アクセス (つまり、いつでも任意の要素にアクセスできる) を行うためです。何らかの方法でこれを達成できたとしても (0.9Tb を格納)、データ アクセスが非常に遅くなり (特にファイルにマッピングする場合)、アルゴリズムが非効率になります。
代わりに、いつでもマトリックス全体にランダムにアクセスする必要がないように、アルゴリズムを書き直す方法を考えてください。または、この多くのデータを保存する必要性を減らす他の方法。
ハイ パフォーマンスとは、計算量の削減だけでなく、ランダム データ アクセスの削減も重要です。
行列全体を同時に処理する必要があり、ほとんどの行列要素が空白になる場合は、ある種のスパース行列データ構造の使用を検討する必要があります。多くの線形代数ライブラリは、スパース行列(Boost.uBlas、Eigenなど)と一部の画像処理ライブラリ(OpenCVなど)をサポートしています。
これをファイルに保存し、行列の必要な部分をメモリにマップできます。たとえばhttp://en.wikipedia.org/wiki/Memory-mapped_fileを参照してください
それはマトリックスが持つ特性に依存します。
0がたくさんあるのでしょうか?その場合、0を格納しないスパース行列の実装を使用できます。
帯行列の場合は、対角帯だけを格納できます。
マトリックスのプロパティを調べて、メモリを節約できる場所を確認する必要があります。このような最適化を可能にするプロパティが見つからない場合は、ファイルに保存する必要があります。
それが疎行列であり、それに線形代数を実行する必要がある場合は、Trilinos (Epetra または Tpetra パッケージを使用) や Hypreなどの科学線形代数ライブラリを使用します。これらは高度に並列化されたライブラリです (コードを並列で実行できる場合に便利です)。私は Hypre を使用したことがないので (Trilinos よりもパフォーマンスが優れていると聞いたことがありますが)、それについては何も言えません。Trilinos は、約 50 ~ 60 個のパッケージを含む巨大な (大きすぎると言えます) ライブラリであり、学習するのはそれほど簡単ではありません。ただし、巨大な行列を処理する必要がある場合は、十分にテストおよび開発された TPL に依存することが理にかなっています。行列のストレージについては、Epetra/Tpetra が Trilinos で調べるパッケージです。