0

フォーラムにはヒープなどについて多くの質問があることは知っていますが、これほど役立つものはありませんでした (機能しない理由を理解することを除いて)。

膨大な量のデータがあり、もちろんヒープが追いつきません。保存する必要があるデータは整数のみです。Malloc はかなり早い段階で null を返し始めます。

サイズの 4 つの配列: (malloc による割り当て)

  • 875715
  • 875715
  • 875715
  • 5105043 個のセル (ただし、2D 配列です)

ここに私の質問があります:

1) 必要なメモリの量を知るには、次のようになります: 875715 * 3 * 4 + 5105043 * 4 = 62454492 ? (整数は4なので) 62MBくらいということでしょうか。(ダサく見えたらごめんなさい)

2) 利用可能なヒープのサイズをどのように知ることができますか? 増やす方法はありますか?

3) 同じサイズの配列が 3 つあるのですが、それらを 1 つの 2D 配列に結合する利点はありますか? たとえば、3 つの異なる配列の代わりに array[875715][3] (もちろん、malloc を使用)

Windows 7、64 ビット、8 GB の RAM を使用しています。

編集: これは、1D 配列と 2D 配列の先頭 (最初のレベル) に対して行う典型的な割り当てです。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#define FILE_NAME "SCC.txt"
#define ARRAY_SIZE 875714

void getGgraph(int mode,int **graph,int *sizeGraph);
int sizeOfArray(int *array);
void getGraphSize(int mode,int *arr);
void runThroughGraph(int node,int **graph,int *exploredNode,int *magicalPath,int *sizeGraph);
void getMagicalPath(int *magicalPath,int **graph,int *sizeGraph);

    void main()
    {
        int i, *magicalPath,*sizeGraph, **graph;

        /* ------------- creation of the array sizeGraph ------------------ */ // contain the size of each level to initiate the array
        if ((sizeGraph =(int*) malloc((ARRAY_SIZE + 1) * sizeof(sizeGraph[0]))) == NULL) {
            printf("malloc of sizeGraph error\n");
            return;
        }
        memset(sizeGraph, 0, (ARRAY_SIZE + 1) * sizeof(sizeGraph[0]));

        /* ------------- create reverse G graph, this will be a 2D array ------------------ */
        if ((graph =(int**) malloc((ARRAY_SIZE + 1) * sizeof(*graph))) == NULL) {
            printf("malloc of graph error\n");
            return;
        }

        getGgraph(1,graph,sizeGraph);

    // [..... Some more code .....]
    // end of main()
    }


void getGgraph(int mode,int **graph,int *sizeGraph) {
    char int_string[40];
    char stringToAdd[10];
    FILE *integerFile = NULL;
    int i = 0, j = 0, n = 0,stCurrentInt, tail,head,*temp;

    getGraphSize(mode,sizeGraph);

    for (i = 0; i < (ARRAY_SIZE + 1); i++) {
        if ((graph[i] =(int*) malloc((ARRAY_SIZE + 1) * sizeof(graph[i][0]))) == NULL) {
// THIS IS WHERE IT STOPS (i = 594)
            printf("Malloc of graph[%d] error\n",i);
            return;
        }
    }

    if ((temp =(int*) malloc((ARRAY_SIZE + 1) * sizeof(temp[0]))) == NULL) {
        printf("malloc of temp in getGgraph function error\n");
        return;
    }
    memset(temp, 0, (ARRAY_SIZE + 1) * sizeof(temp[0]));

    if ((integerFile = fopen(FILE_NAME, "r")) != NULL) {
        while (fgets(int_string,40, integerFile) != NULL) {
                n = 0, i = 0, stCurrentInt = 0,head = 0; // initialisation

                while (int_string[n] != NULL)   {
                    if (int_string[n] == ' ') {
                        for (j = stCurrentInt; j < n; j++) {
                            stringToAdd[j - stCurrentInt] = int_string[j];
                        }
                        if (stCurrentInt == 0) // first integer is the index
                            tail = (int) atoi(stringToAdd);
                        else {
                            head = atoi(stringToAdd);
                            if (mode == 0) {
                                graph[tail][temp[tail]] = head;
                                temp[tail]++;
                            }
                            else if (mode == 1) {
                                graph[head][temp[head]] = tail;
                                temp[head]++;
                            }
                        }
                        for (j = 0; j < 10; j++) { // empty the string for next iteration
                            stringToAdd[j] = NULL;
                        }
                        stCurrentInt = n + 1;
                    }
                    n++;
                }

        }
        free(temp);
        fclose(integerFile);
    }
    else {
        printf("\n File missing in getGgraph.\n");
        return;
    }
}


void getGraphSize(int mode,int *arr) {
    char int_string[40],stringToAdd[10];
    FILE *integerFile = NULL;
    int i = 0, j = 0, n = 0,stCurrentInt,tail,head;

    if ((integerFile = fopen(FILE_NAME, "r")) != NULL) {
        while (fgets(int_string,40, integerFile) != NULL) {
                n = 0, i = 0, stCurrentInt = 0,head = 0; // initialisation
                while (int_string[n] != NULL)   {
                    if (int_string[n] == ' ') {
                        for (j = stCurrentInt; j < n; j++) {
                            stringToAdd[j - stCurrentInt] = int_string[j];
                        }
                        if (stCurrentInt == 0) // first integer is the index
                            tail = (int) atoi(stringToAdd);
                        else
                            head = atoi(stringToAdd);

                        for (j = 0; j < 10; j++) { // empty the string for next iteration
                            stringToAdd[j] = NULL;
                        }
                        stCurrentInt = n + 1;
                    }
                    n++;
                }
                if (mode == 0 && head != 0)
                    arr[tail]++;
                else if (mode == 1 && head != 0)
                    arr[head]++;
        }
    }
    else {
        printf("\n File missing in getGraphSize.\n");
        return;
    }
}

EDIT2:私のプログラムは、実際には小さな入力の魅力のように機能します。

[..... いくつかのコード .....]: これは発行後のものです。失敗した malloc は getGraph 内にあるため、残りは関係ないと思います。プログラムの後半で配列を free() します。

4

1 に答える 1

1
  1. 電卓を引き出す必要もなく、コードがなくても、分析は正しいように見えます。
  2. HEAP は必要に応じて拡張され、OS プロセスの制限によってのみ制限されます。. デフォルトでは、Windows では 2Gig を超えることはありません。より具体的なリンクを次に示します。
  3. 大きな利点はありません。

あなたの場合、メモリ割り当てアルゴリズムを調整して、必要なものだけを割り当てることで、より良いサービスを提供できます。

于 2012-07-28T11:29:42.910 に答える