0

次のマップに約14GBのデータを保存しています。

struct data
{
   char* a;
   char* b;
   data(char* _a, char* _b)
   {
        int alen = strlen(a);
        a = new char[alen+1];
        strcpy(a,_a);
        a[alen]='\0';

        int blen = strlen(_b);
        b = new char[ blen+1];
        strcpy(b,_b);
        b[blen]='\0';        
    }

    ~data()
    {
       delete [] a;
       delete [] b;
    }
};

struct ltstr
{
    bool operator()(const char* s1, const char* s2) const
    {
        return strcmp(s1, s2) < 0;
    }
};

map<const char*, data*, ltstr> m;

プログラムは特定の数のレコード(26293289のうち10440440)に対して実行され、しばらくするとiamが次のエラーメッセージを受け取ります。

Program terminated with signal SIGKILL, Killed.
The program no longer exists. 
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.25.el6.x86_64 libgcc- 4.4.5-6.el6.x86_64 libstdc++-4.4.5-6.el6.x86_64

上記の終了を回避するにはどうすればよいですか?

サーバー仕様:

  Mem:  24605344k total, 15148556k used,  9456788k free,    20892k buffers
  Swap:  2097144k total,   161364k used,  1935780k free, 14469244k cached
4

4 に答える 4

4

OOMキラーはおそらくあなたのプロセスに介入して 殺しているでしょう。ログを確認してください

于 2013-01-11T02:11:20.067 に答える
2

プログラムの詳細を知らなくても、ファイルのメモリマッピングを試してメモリ使用量を減らすことができます。

于 2013-01-11T02:14:36.737 に答える
1

how can i avoid above termination?

By rethinking your design. What are you trying to accomplish? In particular, why do you need a lookup table with 27 million entries in memory?

于 2013-01-11T02:31:19.450 に答える
1

明らかにメモリが不足しているので、明らかにすべきことは、使用しているメモリの量を減らすことです。1つの可能性は、std::map(通常は赤黒木を使用する)の代わりに、パトリシアトライのようなものを使用してデータを格納することです。

正確にどれだけの利益が得られるかは、ストリングにどれだけの冗長性があるかによって異なります。ある程度、キーとして使用している文字列のサイズと、それらとともに保存しているデータのサイズにも依存します。

状況によっては、各キーに関連付けられたデータとして保存する文字列に対して、固定テーブルを使用したハフマン圧縮などの使用を検討することもできます。ハフマン圧縮は他の状況では必ずしも最も効果的ではありませんが、固定テーブルを使用すると、ここで作業しているような個々の文字列で適切に機能するという利点があります。の文字列の場合dataパーツが長い場合(たとえば、2つのストリングの平均が少なくとも8K)、ハフマン圧縮に加えてLZ *ファミリーの圧縮を適用する価値があるかもしれませんが、短い場合(たとえば、少なくとも数未満のもの)キロバイト)LZはおそらくうまく機能しません(文字列をブロックにグループ化する場合を除いて、他の文字列を数キロバイト解凍して、いつでも気になる文字列に到達する必要がある場合があります'いくつかのデータを取得しています。

圧縮は通常、圧縮/解凍せずにメモリから直接データにアクセスするよりも低速ですが、物理メモリが不足して仮想メモリを使用する場合に通常発生するように、通常はディスクからデータを取得するよりも高速です。

于 2013-01-11T02:22:54.137 に答える