- 1 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 21:04:54 ]
- C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part66 pc12.2ch.net/test/read.cgi/tech/1231640498/ ※part63, part66 が重複していたようですので part69 としました。
- 930 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 10:44:45 ]
- ちょいとしつもんだんですが、
30,000x30,0000x4程度のbool配列と、30,000x30,0000のint配列を使いたいという思いでいっぱいです。 しかし単純に配列を作ってしまうと、やはりout of memoryです。 どうにかして要素数を減らすのが一番だとは思うんですが、 一般的に、このように膨大な要素の配列を扱わざるをえない場合にはどのような方法を用いるのでしょうか?
- 931 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 10:49:51 ]
- >>930
疎なデータならその部分だけを保持する
- 932 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 10:51:08 ]
- >>930
速度が滅茶苦茶遅くていいならファイルをメモリと見なし operator[]をオーバーロードするとか
- 933 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 11:09:18 ]
- >ちょいとしつもんだんですが、
質問団?w そのくらいの量なら、64bitOSで普通にnewでもvectorでも持てると思うけど。 まぁ、swapされるのは覚悟する必要があるな。 処で、それ本当に必要なの? 疎行列として扱うとか、boolではなくcharかbitで保持するとかできない?
- 934 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 11:29:57 ]
- >>933
>64bitOSで普通に さらっと、OSレベルで条件付け加えんなw アフォか
- 935 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 11:32:54 ]
- >>934
2バイト整数を3万掛ける3万なら、32bitOSでも普通にOK。 今時、Windowsでも2GB位積んでるのが当たり前だしね。
- 936 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 11:38:47 ]
- > 30,000x30,0000x4程度のbool配列と、30,000x30,0000のint配列を使いたいという思いでいっぱいです。
30,0000?
- 937 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 11:41:11 ]
- うお、それは気づかなかった。30万なのか?w
- 938 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 11:43:13 ]
- 2G程度あっても無駄無駄無駄ーなのです
- 939 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 11:58:11 ]
- ごめんなさい!3万x3万です!ちなみに768MBしか積んでません><クズです!
>>931-933 0or1のフラグとして使うつもりでboolを使いました。 やろうと思っていることは、「生物学で使うDNA塩基配列のアライメント」で int 3マンx3マンを隅から数値を埋めていく一方で、 その数値を確認しながら条件に従って、その要素に対応するboolの配列の要素1-3に1or0を入れていく。 ということを行っています。 intの配列array[i][j]については[i+1][j+1]まで処理した時点で破棄できるのでもっと少なくできると思うんですが、 bool配列についてはすべて埋め終わった後に、もう一度フラグの確認をしていくのですべて残しておく必要があります。 ちなみにbool型が一番サイズが小さいと勝手に思い込んでいました。
- 940 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 12:05:43 ]
- なんだか良くわからないけど,計算用の鯖用意すれば解決するんじゃないかな^^;
パソコンでやるなら>>933とか. でも > int 3マンx3マンを隅から数値を埋めていく一方で、 > その数値を確認しながら条件に従って、その要素に対応するboolの配列の要素1-3に1or0を入れていく。 これって注意深く行うとすると,今状態[3万×3万]と次状態[3万×3万]が必要になるんじゃないかい? 軽くめんどくさい
- 941 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 12:26:39 ]
- int配列やbit配列の要素間で、相互参照がないなら
ストレージに対して、逐次読み出し、逐次書き込みで いいんじゃねーの。
- 942 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 12:31:29 ]
- 塩基配列なら AGTC の4種
30kx30k 900M 1bit データなら 900M/8 = 112MB 塩基配列なら4種2bit 900M/4 = 225MB メモリに載せるのは可能っぽい
- 943 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 12:35:52 ]
- >>939
768MBでも仮想記憶があるから屑だなんて言っちゃイヤ! と言うのはさておいて。 >intの配列array[i][j]については[i+1][j+1]まで処理した時点で破棄できるのでもっと少なくできると思うんですが、 これは、相互参照があるってことなのかな? だとしても、1行3万点として前後1行ずつで併せて3行がメモリにあれば事が足りるよね。 後は、ディスクをぶん回すことになるけどなんとかなりそうだ。 # 最初は1000x1000くらいに絞って作らないとデバッグの段階で死ねるね。
- 944 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 12:51:27 ]
- 連続領域で取ることができないだけなので、int**にして3万を3万回動的確保すればいけるんじゃないの?
|

|