• 締切済み

ビン数が大きなヒストグラム

C言語で、あるデータ群をヒストグラムにまとめたいと思っています。 ヒストグラムのビンに相当するものを配列で用意して…… という、よく学習課題でもあるような形ならば簡単に出来るのですが、 今回やりたいと思っているものは、非常にビンの数が多いのです。 具体的に言うと、数万、数十万という数で、 それだけの要素数を持った配列を用意しようと思っても メモリの都合上、エラーが起きてしまいます。 そこで、配列に記憶させるのではなく、 テキストファイルを用意して、これの入出力をすることで ヒストグラム情報を作る方法をとりました。 この方法で成功はしたのですが、ファイルのオープン/クローズを 何度も繰り返すことになるため、動作が非常に遅くなってしまいます。 要するに、数万、数十万という数の変数を扱いたい、という問題なのですが、 何か良い手段はないでしょうか。

  • CGI
  • 回答数1
  • ありがとう数3

みんなの回答

回答No.1

高々数十万程度のデータでメモリが確保出来ないのかな、というのが不思議なのですが、 1データあたり、どれくらいのサイズがあるのでしょうか? たとえば、次のようなプログラムはコンパイル/実行出来るでしょうか? #define SIZE (1000000) #include <stdio.h> #include <stdlib.h> int main(){ int *a; int i; a = (int *) malloc(SIZE * sizeof(int)); for(i=0; i<SIZE; i += SIZE/10 ){a[i] = i;} for(i= 0; i<SIZE; i += SIZE/10 ){printf("%i\n", a[i]);} free(a); }

hiro2pzbt
質問者

お礼

……あれ。 コンパイル/実行できました。 指摘されて、おかしいなと思ったので色々試してみたところ、 “出来ない”と言っていたのは、ちょっと変な環境下での話でした。 この程度なら、普通は問題ないものなのですね。 わざわざ特殊な環境下でやる必要もないので、問題解消です。 お騒がせしました。 アドバイスありがとうございました。

関連するQ&A

  • 配列の要素数に変数を入れたいときには

    よろしくお願いします。 配列の要素数には定数しか入れられないのですが,どうしても変数を入れたいときは,それを引数として関数を呼び出すしか方法はないでしょうか。 具体的には,scanfで手に入れたint型の変数を要素数とする配列を宣言したいのですが,どうすれば良いでしょうか。 ご教授ください。

  • MIPSアセンブリ言語で配列を宣言するには?

    現在MIPSアセンブリ言語を学習していますが、配列に相当するものの宣言の仕方を詳しく知りません。 int items[5] ={0,0,0,0,0}; (C言語の場合) のような配列をMIPSで用意するなら、 items: .word 0,0,0,0,0 としてやるなどすればよいことまではわかっていますが、もし配列の要素数が500だった場合、上で0を500個も書かなければならないのでしょうか。短く書ける方法はありませんか。

  • perl 配列の要素数について

    配列の要素数について質問させていただきます。 プログラムの中で、以下のようにファイルの内容を1行ずつ読み込み、配列に入れています。  open (IN, "ファイル名");  @data = <IN>;  close (IN); こういった形で配列に入れていった場合、入れられる最大行数(=最大要素数)はどれくらいになるのでしょうか。 現在100万行のテキストファイルは、問題なく読み込めているようでした。 ご存知の方がおられましたら、ご回答いただければと思います。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • プログラミングのプログラムの作成を教えてください!!

    「1 から6 の数を乱数で発生させ,サイコロを試行する.この試行を100 回まで繰り返して出た数を配列 変数に記録してゆき,試行全体の平均値,度数の分布,ヒストグラムを表示せよ.」と言う課題が出されたんでけどわかりますでしょうか?さいごはコマンドプロントで実行するんですが… ぜひ教えてください。どうかお願いします。

  • VB.net 引数で配列変数を渡す際の要素数

    VB.net 2010 の質問です。 配列変数を他のプロシージャに引数で渡す際の、配列変数の要素数をあらかじめ宣言していないとエラーになります。 Dim Hairetsu() As String ' ←エラー Dim Hairetsu(100) As String ' ←正常 Public Sub aaa(ByRef Hairetsu() As String) Hairetsu(0) = "Test" '←正常の場合と、エラーの場合 End Sub Hairetsu(100) のように、要素数を宣言していると、エラーにならないのですが、 プログラム中、要素数がどこまで増加するか、分かりません。 Hairetsu()のように、要素数未確定の配列変数を渡すことは出来ないのでしょうか。 ご存知の方がいらっしゃいましたら、なにとぞアドバイスの程、よろしくお願いいたします。

  • ファイルから数字列を16進数の数字列として読み込むためには?

    C言語初心者です。 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef… 0135792468acebdf0135792468acebdf0135792468acebdf0135792468acebdf… … のようなファイルがあったときに、このファイルを自分で用意した配列num[]に1次元配列形式、かつ16進数で読み込むコードが思いつかず困っています。ファイルは複数行かつ複数列存在し、各行と各列はそれぞれ長さはマチマチとします。 つまり、例えば 1234abcdf 2315a cedf45 のようなファイルをnum[20]という配列に格納したいのです。 この場合、fgetc, fgets, fscanf等、使える関数は数種類あると思うのですが、どの方法がもっとも効率的に、かつ高速に自分が用意した配列numに読み込めるのでしょうか? また、メモリ量もできるだけ節約したいので、同状況でmalloc等で読み込んだファイルの文字数のみの要素数を確保するやり方も考えているのですが、これも思いつかずに困っています(つまり、num[10000]とかをやるのは避けたいということです) C言語に堪能な方がおられましたらご教授下さい。具体的なソースで説明していただけると助かります。

  • ハッシュの中に格納された配列の要素数を得る方法

    予想配列のあるキーを配列とします。 %hash; @hash{'a'}=['aa','ab','ac']; 一方で普通の配列をスカラ変数として扱うと配列数を表します。 @array=(a,b,c,d,e); $num=@array; # $numは5になる。 それでは $num=@hash{'a}; あるいは  $num=@{hash{'a'}}; としたらどうなるのって ARRAY(0x2438c4) みたいになって、$numに@hash{'a'}の要素数は入りません。 予想配列の中に格納された配列の要素数を取り出す簡便な方法はないものでしょうか。 お手数をお掛けします。

    • ベストアンサー
    • Perl
  • 配列の要素数を調べる方法

    配列の中にいくつ要素があるか後から調べる方法はあるでしょうか? int test[4][3] = {   {0,1,2},   {0,1,2},   {0,1,2},   {0,1,2}, } ; 上のケースだと、X方向に3、Y方向に4つの 要素があります。しかし、これだとあらかじめいくつ要素があるかを決めて 置かないといけません。 例えば、 int test[] = {0,1,2,3....} みたいに宣言された場合や、 char *test[] = {   "ああああああ",   "いいいいいい",   "うううううう",      ・      ・ //(これは文字列の数を要素数とします) } ; のように宣言された二次元配列などで、後から配列内にいくつ要素があるかを 調べることなどは可能でしょうか?

  • MATLABの関数で配列の要素を返す方法

    現在MATLABについて勉強しているのですが、関数(function)を用いて配列の値を返す方法が分からず困っています。 関数で定義した配列A(m行n列)を用いて、メイン関数で配列の要素Aijを呼び出す、ということがしたいのです。 function y=Func(x)等で1変数や他変数の入出力の仕方は分かります。 どなたか初心者でも理解できるようご教授お願い致します。

  • 要素数がプログラム内で変化する配列のクラス間のやりとり

    随分初歩的な質問をしているとは思うのですが、解決方法がみつからないので質問をお願いします。 C++で配列をクラスから呼び出すときに、そのクラスの要素数がプログラム内で変化する場合、 どのようにするのが良いのでしょうか? Class class_A { private: プログラム内で要素数が変化する配列 public: get_hairetu(){return 上の配列} } Class class_A::openfile { テキストからデータ読み込み データ数に応じて配列の大きさが変化 } int main(void) { class_A A; 配列=A.get_hairetu(); ↑ここでclass_Aで決定した配列の要素数に応じて配列の要素数を変化させたいです } なるべくリストではなく配列で作成したいのですが、配列を全クラスで共有する方法があればそちらをお願いします。 (class_Aとmainはそれぞれ別のcppファイルに記述しています) vector型で配列を作ることも考えたのですが、VC++ではなぜか使えませんでした。 質問内容が曖昧で申し訳ありませんが、ぜひ回答をお願いします。

専門家に質問してみよう