• 締切済み

MySQLでの128次元ベクトルの距離計算高速化

ki073の回答

  • ki073
  • ベストアンサー率77% (491/634)
回答No.7

No.5でありましたRubyのプログラムを載せておきます。 2つの方法計算しており、その時間を測定するようにしていますので、だいぶ長くなっています。 メモリが3GBytesで仮想メモリを使わずにぎりぎり下の計算ができます。上はもう少し少なくても大丈夫です。 こちらでの結果は、上が10秒、下が2秒程度です。メモリさえあれば下がだいぶ速いです。最近8GBytes増設して4000円弱でしたので、メモリを奮発すれば良いと思います。 narrayという行列計算ライブラリを使っていますので、rubygemsでインストールしておいてください。行列計算がかなり速くなります。 -------------- require "rubygems" require "narray" require "benchmark" # 乱数でデータ作成 dat1=NArray.sfloat(128).random!(100) pt=NArray.sfloat(128, 1500000).random!(100) distance_sq=NArray.sfloat(pt.shape[1]) puts Benchmark::CAPTION puts Benchmark.measure{ # メモリ節約計算 (0...pt.shape[1]).each{|i| distance_sq[i]=((pt[true, i]-dat1)**2).sum } nearest_index1=distance_sq.sort_index[0] puts "nearest_id: #{nearest_index1} distnce: #{Math.sqrt(distance_sq[nearest_index1])}" } puts Benchmark.measure{ # 高速計算?? nearest_index2=((pt-dat1)**2).sum(0).sort_index[0] puts "nearest_id: #{nearest_index2} distnce: #{Math.sqrt(((pt[true, nearest_index2]-dat1)**2).sum)}" }

関連するQ&A

  • 高次元整数ベクトルの高速計算

    VC++2010でwindowsアプリケーション(CLI)を作成しています。 その中で1000次元の整数ベクトルのパワーを求めるために概略次のような計算をしています。 int v[1000]; //v[0]~v[999]に整数値を代入後 long long int power = 0; for(int i = 0; i < 1000; i++){ power += v[i] * v[i]; } この計算を数万回繰り返す必要があるため、是非高速化を図りたいのですが、CPUのベクトル計算機能等を利用して高速化することができるでしょうか?

  • PHP+MySQLで高速化

    mysql_query()が返したresourceの行数は得られませんか? 例をあげると データが id p (フィールド) 42 651 23 357 67 123 28 385 このように4レコード有ったとして $res = mysql_query('select p from tbl where p="123"'); これで、$resから3行目というのを得て、3を使ってidの67を得たいのですが、 $res = mysql_query('select id,p from tbl where p="123"'); のようにして$resのidを見るようにする以外の方法は無理なんでしょうか? もし前者が可能ならそちらの方が速いと思うのですが。

    • ベストアンサー
    • PHP
  • MySQL「10行を超えたら削除する」について

    初心者と言うより、全く全くわからない状態で質問することご容赦下さい。ブログ調の掲示板で、MySQLを使っておりますが、掲示板内の投稿が10投稿を超えると、古いものから順に削除されていく状態のようで、そのリミットを完全に解除したいと思い、ファイルを探していたら、 //10行超えたら削除していく $result = mysql_query("select * from bbs_data where bbs_user_id='{$urow[id]}' order by id desc limit 9,1") or die(mysql_error()); if(mysql_num_rows($result) == 1){ $row = mysql_fetch_assoc($result); $result = mysql_query("delete from bbs_data where bbs_user_id='{$urow[id]}' and id < '{$row[id]}'") or die(mysql_error()); } という部分がありました。このリミットを解除するにはここのプログラムを変えればいいのでしょうか? その場合、どのようにしたらいいか教えて下さい。

    • ベストアンサー
    • MySQL
  • phpとmysqlでデータの一覧表示をしたいと思っています。

    phpとmysqlでデータの一覧表示をしたいと思っています。 ずらーっと並べるだけでなく、1ページに100件した場合には 10行毎に<hr>や<br>などのタグを挿入して間隔を空けたいのですが どのようにしたらいいのか悩んでいます。 現在は下記のようにLIMITで何度もqueryを発行しています。 できれば1回のqueryで処理したいのですが 他にどのような方法があるでしょうか。 $rs = mysql_query("select * from data order by id desc LIMIT 0,10 ;",$conn); while($rec = mysql_fetch_array($rs, MYSQL_ASSOC)){ $site = $rec['site']; $url = $rec['url']; echo '<a href="'.$url.'">'.$site.'</a>'; } $rs = mysql_query("select * from data order by id desc LIMIT 10,10 ;",$conn); while($rec = mysql_fetch_array($rs, MYSQL_ASSOC)){ $site = $rec['site']; $url = $rec['url']; echo '<a href="'.$url.'">'.$site.'</a>'; } $rs = mysql_query("select * from data order by id desc LIMIT 20,10 ;",$conn); while($rec = mysql_fetch_array($rs, MYSQL_ASSOC)){ $site = $rec['site']; $url = $rec['url']; echo '<a href="'.$url.'">'.$site.'</a>'; } よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • phpでmysqlからデータを取り出して一覧表示

    phpでmysqlからデータを取り出して一覧表示させるプログラムを造りたいのですが、どうもうまくいきません。まずはデータの取り出し表示の仕方を教えてください。 $sqlstr="select * from webdiary where username=$id order by topicid asc"; $result = mysql_query( $sqlstr ); この後どのようにしたらよいでしょうか?

    • ベストアンサー
    • PHP
  • PHPでMySQLのデータを2次元配列に格納する

    PHPの本に $r = mysql_query("SELECT * FROM tb;"); while ($row = mysql_fetch_array($r)){ print "{$row['id']}{$row['title']}<BR>"; } とあったのですが1行ずつしか保存できないので 2次元配列row[][]で while ($row[] = mysql_fetch_array($r)){ } foreach($row as $v){ print "{$v['id']}{$v['title']}<BR>"; } このようにコーディングしたところ 一応うまく表示されたのですが、問題はないですか? もし普通はこういう風にするみたいなやり方があれば 教えて欲しいです。

    • ベストアンサー
    • PHP
  • 2次元配列の作り方

    データ型 name varchar(30), item1 char(8), item2 int(6) として下記のテーブルがあります。 | name | item1 | item2 | | taro | abcd | 28 | | taro | efghk | 33| | taro | lmnp | 05 | これから2次元配列形式でデータを取得したいのですが、うまく並んでくれません。 まず、 (前略) $query ="SELECT item1,item2 from *** where name='taro'"; $result = mysql_query($query,$conn_id) or die($query.'failed('.mysql_error().')'); $data[][] = mysql_fetch_assoc($result);  とすると(当然ながら)、 Array ( [0] => Array ( [0] => Array ( [item1] => abcd [item2] =>28 ) ) ) と最初のレコードだけが取得されます。 while($data[][] = mysql_fetch_assoc($result)){ print_r($data); echo "<br/>\n"; } とすると、 Array ( [0] => Array ( [0] => Array ( [item1] =>abcd [item2] => 28 ) ) ) Array ( [0] => Array ( [0] => Array ( [item1] => abcd [item2] => 28 ) ) [1] => Array ( [0] => Array ( [item1] => efghk [item2] => 33 ) ) ) Array ( [0] => Array ( [0] => Array ( [item1] => abcd [item2] => 28 ) )      [1] => Array ( [0] => Array ( [item1] => efghk [item2] => 33 ) )      [2] => Array ( [0] => Array ( [item1] => lmnp [item2] => 05 ) ) ) となってしまうのですが、 Array ( [0] => Array ( [0] => Array ( [item1] => abcd [item2] => 28 ) )      [1] => Array ( [0] => Array ( [item1] => efghk [item2] => 33 ) )      [2] => Array ( [0] => Array ( [item1] => lmnp [item2] => 05 ) ) ) だけを取得させるにはどのように書けば良いでしょうか?

    • ベストアンサー
    • PHP
  • mysql_fetch_arrayとテンプレートの使い方

    データベースからランダムに取り出した3つのデータがあります。 取り出したデータにはそれぞれid、name、ageのデータが入っています。 $rs = mysql_query("select * FROM table order by Rand() LIMIT 0,3;",$con); while($rec = mysql_fetch_array($rs, MYSQL_ASSOC)){ $tpl->assign(array( id => $rec[id], name => $rec['name'], age => $rec[age] )); } これだと1種類のデータが3つ連続して表示されてしまいました。 3種類のデータを全部表示するにはどのようにしたらよいのでしょうか? テンプレート(?)の使い方がよく分かっていないので検討違いのことをしている気がしますがよろしくお願いします。

    • ベストアンサー
    • MySQL
  • MySQLのデータをPHPで多次元連想配列にしたい

    MySQLのデータを多次元連想配列にする方法を教えて下さい。 下記のような多次元連想配列のデータがあります。 これと同様のMySQLに登録されたデータから多次元連想配列を作りたいと思います。 $test= array( array("id" => "1","kamoku" => "算数","tensu" => "70"), array("id" => "2","kamoku" => "理科","tensu" => "88"), array("id" => "3","kamoku" => "国語","tensu" => "90"), ); print_r($test); ---print_r($test)の結果--------------------------------- Array ( [0] => Array ( [id] => 1 [kamoku] => 算数 [tensu] => 70 ) [1] => Array ( [id] => 2 [kamoku] => 理科 [tensu] => 88 ) [2] => Array ( [id] => 3 [kamoku] => 国語 [tensu] => 90 ) ) -------------------------------------------------------- これと同様のデータをMySQLに作成します。 テーブル名:test 列名:id,kamoku,tensu MySQLからデータを取得 try { $dbh = new PDO($DSN , $DBUSER , $DBPASS); $query = select * from test $stmt = $dbh->prepare($query); $stmt->execute(); while($result = $stmt->fetch(PDO::FETCH_ASSOC)) { $id = ($result['id']); $kamoku = ($result['kamoku']); $tensu = ($result['tensu']); } } catch(PDOException $e) { print "Error!: " . $e->getMessage() . "<br>"; die(); } このソースの中で何らかの処理をして print_r($test); を実行したときに ---print_r($test)の結果--------------------------------- Array ( [0] => Array ( [id] => 1 [kamoku] => 算数 [tensu] => 70 ) [1] => Array ( [id] => 2 [kamoku] => 理科 [tensu] => 88 ) [2] => Array ( [id] => 3 [kamoku] => 国語 [tensu] => 90 ) ) -------------------------------------------------------- というような、文頭で記載したものと同じ結果を得たいと思います。 while内で print_r($result);を行うと1行ずつ下記のような連想配列 Array ( [id] => 1 [kamoku] => 算数 [tensu] => 70 ) が取得できているのでこれを連結させて $test_sample=<<<EOF array("id" => "1","kamoku" => "算数","tensu" => "70"), array("id" => "2","kamoku" => "理科","tensu" => "88"), array("id" => "3","kamoku" => "国語","tensu" => "90") EOF; という配列の中身は作ることができました。 (1)ケース1 $test=array($test_sample); print_r($test); としてもダメで、 Array ( [0] => array("id" => "1","kamoku" => "算数","tensu" => "70"), array("id" => "2","kamoku" => "理科","tensu" => "88"), array("id" => "3","kamoku" => "国語","tensu" => "90") ) というようにうまく多次元連想配列になっていません。 (2)ケース2 $test='array('.$test_sample.')'; print_r(test); としてみたところ、 array( array("id" => "1","kamoku" => "算数","tensu" => "70"), array("id" => "2","kamoku" => "理科","tensu" => "88"), array("id" => "3","kamoku" => "国語","tensu" => "90")) というように配列ではなく単なる文字列として表示されてしまいます。 配列の中身を変数で扱う時には特別な記述法などがあるのでしょうか?

    • ベストアンサー
    • PHP
  • mysql のテーブルの名前は数字ではだめですか

    phpmyadmin で数字名前のテーブル上手く作りましたが。。なぜかmysqlで $query = "CREATE TABLE 2234( id int AUTO_INCREMENT key, 入力日 VARCHAR(10 ) $squery1 = mysql_query($query); (create table "2234"( ...)もcreat table '2234'(..)もだめ) なぜかエラーが出ました?