ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

プログラム初心者コミュの超特大データからMAX値を複数取り出してくる方法

  • mixiチェック
  • このエントリーをはてなブックマークに追加
現在、プログラムを個人で考えています。
その中に組み込むプログラムの中で最大値を表示するプログラムを考えてます。
それをDirectXに入れて表示しようとしているのですが、最大値プログラムでつまずきました。
現状はDBはPostgre8.1、プログラムはC++,PHPとVB.NETを複合させて、ソケット通信で色々とデータを取得とか考えています。

その中で助けていただきたい物が2つあります。

1.1秒間に100000個のデータをデータベースに保存します。その数は60秒分蓄積されます。

それを格納するクエリはどのようにしたらよろしいでしょうか?
とりあえず、私の中では

CREATE TABLE data(no integer P,
data integer);

のように考えていますが、どのように考えても数が足りません。

あと何のクエリを作ったらよろしいでしょうか?



2.後々にこのデータから、ある一定数のMAX数を取ろうとも考えています。

とりあえず、500個のMAX数を取り出したいのですが……
これはデータベース上でMAX数を絞り込むのが得策でしょうか?
それとも表示するVB.NET上で計算するのが得策でしょうか?

以上です。よろしくお願いします。

コメント(6)

1.について〜
毎秒10万件のレコードを作成する、ってことでいいんですかね?
60秒で600万件…って考えると、実行中は常にHDDが絶賛稼働中になるわけですが〜
なんでそんな大量のデータを保存しなきゃならないのか、というところ次第かも知れませんが、
メモリ上に置いておくとすれば、60秒で30MBくらい?(データが32ビット値一つの場合)
あと、
>どのように考えても数が足りません。
は、何の数が足りないんでしょう?


2.について〜
MAX=最大値、なので、MAX値は一つだけだと思(以下略
上位500件分の抽出ってことですかね?
基本的に、VB.NETでの処理速度よりDBのエンジンの方が高速なのは明らかですし、
ネットワーク越しにデータのやりとりをするのであれば、
必要なデータだけを抽出した結果を転送するのが得策かと。
(´ω`)質問の意図をもう少し教えてもらえますでしょうか?
1の場合1秒間に10万件のデータを60秒継続して蓄積し、計600万件のデータだけを
扱うのか、それとも60秒以降は先頭10万件を破棄して、新たに10万件を追加していくので
しょうか?
赤いアイツさんが言われているように、数が足りないという意味もよくわかり
ません。例のクエリからするとテーブルの作成自体は特に問題ないようにおもいます。
2のMAX値を500件というのも入力されるデータにもよりますが、最大値となる
データが複数存在するということでしょうか?最大値がほしいだけなら、insert
処理の前に最大かを判別して持っておくというのはどうでしょう?(´ω`)
表示用のVBで全てのデータを読み込むのは、あまりメモリにもやさしくないと
思うので、DB側で処理したデータを読み込むほうがいいようにはおもいます





申し訳ありません。
少し言葉が足りませんでした。
まず、この自作プログラムはDirectXに表示するデータ解析用プログラムです。
そのため、最低一分間のデータは確実に保持しなければいけません。
その中で、使用者が1分間のうちに何秒表示してくれと入力するとその期間内のデータが表示される仕様となっています。
これをVBの縦500 横1000の表示領域に入れる予定ですが、全表示すると確実に入りきりません。
そこで、30秒表示の場合6000000件÷2÷1000で表示できる領域を作らなければならないわけです。その領域を作る為に、その部分でのMAX値を使います。

>どのように考えても数が足りません
私の考えでは1秒間ごとのクエリを作ろうと考えていたのですが、それでは処理が遅すぎるので尋ねていました。
私が書いた上記のクエリで1000件データを行なうと表示だけで26秒かかってしまうのです。
そこで何かを足せば、もっとスピードが速くなるのではないかと考えたのですが……私が持っているSQLサーバーではパンクしました^^
処理が追いつかないようですww
どうやら6000000件データをIndexとDataで持っているしかないようです。
これは解決ということで、勝手に解決して申し訳ありませんm(_ _)m

問題はMAX値でして、SQL文で検索しても6000件データでMAX値をDBから貰おうとしても、PHPで入力タイミングと12秒の差が出てしまいます。一度はC言語で処理して電文としてデータを送ろうとも考えたのですが、ちょっと個人で作るのは難しいです。
そこでPHPからソケット通信で送ってもらおうと考えたのですが、この時画面側で処理するほうが良いのか。SQLで叩けばもっと良い感じで速くなってくれるのか。皆さんの意見を頂きたいわけです。
どうかよろしくお願いします。


ふむふむ(´ω`)なかなか難しいですな。
操作性との両天秤になりますなぁ。的外れかもしれませんが
全データの中での最大値を保持しておいて、それを縮尺につかうというのは
どうでしょう?(´ω`)
返答が遅れて申し訳ございません。

とりあえず、処理が早いC言語でプログラムを組んでLinuxでプログラムを実行しています。ソケットでC言語に渡す方法ですね^^

流れ的には以下になりました
P1:パソコンA P2:パソコンB P3:パソコンC

P1:VB2005(パラメータ入力)(ソケット通信)
↓
P2:C言語プログラム(パラメータ受信)
↓
P2:DB←P3:データ入力
↓
P2:データ取得(MAX値)
↓
P1:DirectX 画像描画(MAX値保持)
  ソケットでリアルタイムに送られてくるデータを配列に保持。
  配列に入力(再描画)

となりました。1データずつ持ってくるのでリアルタイムのような描画が出来るようになりました。
ただ、画面が固まってしまうのは厄介ですが……
この辺は頑張って解決しようと思います。

赤いアイツさん、ケイさんありがとうございました

ここに追加です。
実はPostgreは配列を格納できるんですね(^^;)
MAX値を先に処理してDBから配列型で取れば、配列[1000]のデータをほとんどラグなしで取る事が出来ます。

これを上手く使ってタイムラグをほとんど無くすことに成功しました。
ありがとうございました。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

プログラム初心者 更新情報

プログラム初心者のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。