4

次のコードを使用して、ファイルを文字配列に読み込みます。これで、小さなファイル(たとえば、2 MB)の場合は正しく実行されますが、大きなファイル(140 MB)の場合は、18GBUBUNTUサーバーで提供されsegmentation faultます。誰かがこれを解決する方法を教えてもらえますか?240MBのファイルをメモリに保存するには18GBで十分だと思います。私は64ビットのUBUNTUを使用しており、g++を使用してコンパイルしています。

ifstream is;

char chararray [fileSize] ;

is.read(chararray, fileSize) ;
4

3 に答える 3

5

配列がローカル変数の場合、スタックに収まらないため、スタックオーバーフローが発生します。new代わりに、を使用して直接またはを使用して間接的に、ヒープに「配列」を割り当てますstd::vector

または、メモリマッピングを使用します。関数を参照してくださいmmap

于 2012-11-20T10:18:16.177 に答える
2

スタックにchar配列を割り当てる代わりに、ヒープstd::vectorに動的に割り当てるを使用してみます。

std::vector<char> buffer(fileSize);
is.read(&buffer[0], fileSize);
于 2012-11-20T10:17:01.027 に答える
1

GCCコンパイラには、このためのsizeというデフォルトのコマンドがあります。GCCコンパイラを使用してプログラムをコンパイルします。次に、ファイルサイズを取得できます!

gcc -Wall test.c
size

これは通常のCプログラム用です!パラメータを指定しなかったため、デフォルトのパラメータとして./a.outが使用されます。

最適化を適用する必要がある場合、コードは次のようになります。

praveenvinny@ubuntu:~/Project/New$> gcc -Wall -o1 -fauto-inc-dec test.c -o Output
praveenvinny@ubuntu:~/Project/New$> size output
text       data     bss     dec     hex filename
1067       256      8       1331    533 output

コードサイズにはテキストセクションを使用します。グローバルデータサイズも考慮したい場合は、dataとbssを使用できます。

これにより、コードサイズが出力されます。

time -f "%e" -o Output.log ./a.out

Output.logと呼ばれるログファイルに実行時間を出力します

于 2012-11-21T19:06:21.100 に答える