2

みなさん、良い一日を、

私はCプログラミングに不慣れで、Cで非常に巨大な行列を処理する方法について多くの知識を持っていません。たとえば、行列のサイズは30.000x30.000です。

私の最初のアプローチは、動的にメモリを保存することです。

int main()
{      int **mat;
    int j;
    mat = (int **)malloc(R*sizeof(int*));
    for(j=0;j<R;j++)
        mat[j]=(int*)malloc(P*sizeof(int));
}

また、8.000x8.000の+/-行列を処理することをお勧めします。しかし、大きくはありません。ですから、このような巨大なマトリックスを処理するためのをお願いしたいと思います。

前にも言ったように、私はCに慣れていないので、あまり経験を期待しないでください。

提案を事前に感謝します、

デビッドアレハンドロ。

PD:私のラップトップconfは、Linuxのubuntu、64ビット、i7、および4GBのRAMです。

4

4 に答える 4

5

それと同じ大きさの行列の場合、私はこれらすべての。への呼び出しを避けようとしmallocます。これにより、データ構造をセットアップする時間が短縮され、動的メモリによるメモリオーバーヘッドが削除されます(mallocチャンクのサイズに関する追加情報が格納されます)

一度だけ使用mallocしてください-すなわち:

#include <stdlib.h>
int *matrix = malloc(R * P * sizeof(int));

次に、インデックスを次のように計算します

index = column + row * P;

また、メモリに順番にアクセスします。つまり、最初に列ごとにアクセスします。キャッシュのパフォーマンスが向上します。

于 2012-06-03T22:17:51.083 に答える
1

さて、の2次元配列(行列のほぼ類似したC表現)は30000 * 30000 ints、1バイトあたり4バイトを想定すると、バイト、つまり約3.35ギガバイトintを占有します。3.6 * 10^9従来のシステムでは、コンパイル時にそれほど多くの静的仮想メモリを割り当てることはできません。また、malloc()どちらを使用しても動的に割り当てることができるかどうかはわかりません。小さな数値範囲のみを表す必要がある場合は、を使用してプログラムのメモリ消費量を大幅に(つまり、4分の1に)減らすことができます。char。たとえば、配列のインデックスに対応する特定の数値にブール値を割り当てるなどの操作が必要な場合は、ビットセットを使用して、メモリ消費量をさらに削減できます(32分の1)。それ以外の場合、実行可能な唯一のアプローチは、マトリックスのより小さなサブセットを操作することであり、必要に応じて中間結果をディスクに保存する可能性があります。

これらの大規模なマトリックスをどのように使用するかについて詳しく説明していただければ、より具体的なアドバイスを提供できる可能性があります。

于 2012-06-03T22:25:35.640 に答える
0

floatではなくとして値を宣言していると仮定するとdouble、配列のサイズは約3.4GBになります。必要なのは1つだけで、Ubuntuシステムに仮想メモリがある限り、これは明白な方法でコーディングできると思います。

これほど大きな複数の行列が必要な場合は、次のことを検討してください。

  • コンピュータにもっと多くのRAMを搭載します。

  • コンピューティングクラスターで時間を借り、クラスターベースの処理を使用して必要な値を計算します。

  • データのサブセットで機能するようにコードを書き直し、各サブセットをディスクに書き込んでメモリを解放してから、次のサブセットを読み込みます。

「大規模なデータセットの処理」をGoogleで検索することをお勧めします

于 2012-06-03T22:08:49.407 に答える
0

コメントを追加する方法がわからないので、ここに回答をドロップします。

私が考えることができる1つのことは、実行中のプログラムでこれらの値を取得することはないということです。それらは一部のファイルからのみ取得されます。したがって、すべての値を取得する代わりに、メモリに入らないように30,000x2を1つずつ読み取り続けます。

30k * 30kマトリックスの場合、すべての要素のinit値が0(または同じ)の場合、マトリックス全体を作成する代わりに、60k * 3のマトリックスを作成します(3列は次のようになります:行番号、列番号、値)。これは、影響を受ける最大60kの異なる場所があるためです。

要素がすでに追加されているかどうかを常に確認する必要があるため、これは少し遅くなることを私は知っています。したがって、速度が気にならない場合は、これでうまくいきます。

于 2012-06-04T11:19:21.090 に答える