【誰もいないから】インメモリDBを作ろう【今のうち】 (30レス)
【誰もいないから】インメモリDBを作ろう【今のうち】 http://toro.open2ch.net/test/read.cgi/db/1396865687/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
1: 名無しさん [] 2014/04/07(月)19:14:47 ID:vEOnylDdo 最近盛り上がってるインメモリDBを作ろうかと思いますよ。 基本知識がないので調べながら、なまらまったり作る。 WIKIにはmemsqlとか高速屋とか乗ってないね。 http://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9 かわいいリレーショナル・データベース http://d.hatena.ne.jp/nowokay/20120817 http://toro.open2ch.net/test/read.cgi/db/1396865687/1
11: 1 [] 2014/07/07(月)19:46:07 ID:YkjIc2l9U 落ちてなかった! やっと仕事が一段落したので作成再開。 selectにしろwhereにしろ一時的なtableを作成するという考え方を採用すると 全てがクリアになります。 joinの前にテーブルのカラムの持ち方とwhereを実装します。 カラムは今までは名前だったけどテーブル名と名前で管理する事にします。 joinしたときとかに区別できるように。後々の演算にも便利。カラム名だけで参照 した場合には、登録順で一番最初にマッチした名前になります。カラムには将来の拡張の ために数値、文字などのenumも持たせておきます。 あと一応複数のテーブルを扱えるようにDatabaseクラスも用意します。Databaseクラスは TableクラスのSetです。 whereの実装はカラム名や定数を比較して行毎に比較します。合致していれば元テーブルから 1行コピーするイメージです。カラムは予めカラム名か文字かの比較をしておいてこれを 引数に行ごとにマッチングするかの関数を作ります。将来は文字としての比較演算子>と 数値としての比較演算子>を区別できるように頭の隅っこにはいれておきます。 データベースはインメモリだからちまちま転送するよりもドカンとコピーした方が早い はずです。だからWhereやSelectもなるべくまとめて転送するようにします。幸いvector は代入可能なのでこれを最大限に利用します。Joinでは2つのvectorを合体させることで 1行を作るようなうまい処理ができるといいなぁと思っています。 ということで結構改造しましたがギリギリ300行でCreate,Insert,Select,Whereが 実装できました。次回こそJoinやります。 http://ideone.com/e.js/mBlsfd http://toro.open2ch.net/test/read.cgi/db/1396865687/11
12: 1 [] 2014/07/07(月)19:47:43 ID:YkjIc2l9U ありゃ。ideoneのソース間違えました。 こちらから見てください。 http://ideone.com/mBlsfd 例題はかわいいリレーショナル・データベースの ものにしてみました。 http://toro.open2ch.net/test/read.cgi/db/1396865687/12
13: 名無しさん@おーぷん [] 2014/07/07(月)20:37:04 ID:mDpRDAyXy 今オラクルの勉強してる俺に取ってかなりタイムリーなスレだ http://toro.open2ch.net/test/read.cgi/db/1396865687/13
14: 名無しさん@おーぷん [sage] 2014/07/08(火)09:55:41 ID:rMFc8YmDB >>13 ありがとう。不明な点とかあったら補足します。 今日はjoin実装します。joinって何?ってところからスタートですがw http://toro.open2ch.net/test/read.cgi/db/1396865687/14
15: 名無しさん@おーぷん [] 2014/07/09(水)20:39:20 ID:naIqrL5h5 joinができました。 joinにはinner join,left join, right join,outer joinとかがあります。 DBによってはfull outer joinがなかったり方言があるんですね。知らなかった。 さて普通にjoinと書くとinner joinが呼ばれるようです、多分。2つのDBをある 条件で接続したときに対応するレコードがあるレコードだけを取得するのがinner joinです。 同様に左側全レコードに対応する要素があれば転記するのがleft join, 右側全レコードに対応する要素があれば転記するのがright joinです。 まずは普通のjoinを作ります。 前にwhereで作ったルーチンを流用して2つのDBについて条件値が合致すれば2つのDBから 転記するように作ります。転記はmemmoveにて実装されてるようなのでそれなりに早いはず。 比較にコストがかかってるためにカラム番号から比較する実体を引き渡すように変更。 早く小さくなりました。 商品と生産者を商品IDでjoinさせてみました。まあなんとなく出ています。 tbl1->Join(tbl2,"商品tbl.商品ID","=","生産者tbl.商品ID"); 商品tbl.商品ID|商品tbl.商品名|商品tbl.区分ID|商品tbl.価格|生産者tbl.商品ID|生産者tbl.名前|生産者tbl.TEL 1|りんご|1|300|1|佐藤|012-345-6789 2|みかん|1|130|2|鈴木|012-345-6788 3|キャベツ|2|200|3|武田|012-345-6787 ここで今まで作った関数は全てどこに入れてもOKです。selectしてからjoinしてもjoinしてから selectしても問題ありません。このまま作ってSQLから関数呼び出しに変更するときに 色々考慮すればいいのだなぁという感じです。 次はorder by等やります。ソースは http://ideone.com/d82jLE http://toro.open2ch.net/test/read.cgi/db/1396865687/15
16: 名無しさん@おーぷん [] 2014/07/09(水)23:43:58 ID:PzoSUll2D オラクルとそんな変わらないんだね natural join join using join on inner join outer join だっけ。 そしてnatural joinとjoin using で結合に使われる列に、表別名は使えないという制約があるという…、 http://toro.open2ch.net/test/read.cgi/db/1396865687/16
17: 名無しさん@おーぷん [] 2014/07/10(木)12:19:42 ID:7YX29kERu >>16 join usingは使った事なかったです。複数テーブルで指定された項目名が 同値のものをつなぐんですね。エイリアス使うと構文解析が追いつかないんでしょうか 実装するとしても確かに困りますね join = inner join left join = left outer join right join = right outer join なんですね。cross joinとかnatural joinは理解してないから実装しないかなぁ 通常のDBだとデータの対象はハードディスクになりますからBツリーとかディスク アクセスを高速に行えるように作りますがインメモリDBでは省メモリでなるべく ブロック転送するように作ると早くなるようです これからorderを実装します http://toro.open2ch.net/test/read.cgi/db/1396865687/17
18: 名無しさん@おーぷん [] 2014/07/15(火)11:03:55 ID:KxYr2ZslW orderというかデータの持たせ方に悩んでます どうせインメモリなんだからデータはすべて探索可能な ハッシュとかスキップリストでの実装はどうかと考えてます いい考えがでないようならまずはリストで実験してみます http://toro.open2ch.net/test/read.cgi/db/1396865687/18
19: 名無しさん@おーぷん [] 2014/09/16(火)00:38:19 ID:T3HpIYnP9 進んでますか? http://toro.open2ch.net/test/read.cgi/db/1396865687/19
20: 名無しさん@おーぷん [] 2014/10/05(日)18:48:30 ID:BAUn6XcwD 色々やったけどLINQで実装してるよ。 今はプロファイルなどのデバッグ情報埋め込むところの実装。 http://toro.open2ch.net/test/read.cgi/db/1396865687/20
21: 名無しさん@おーぷん [] 2014/10/05(日)18:50:54 ID:BAUn6XcwD LINQでやるとVisual Studioの支援受けられるし.NETのクラス全部使えるし。 データ型を限定した1さんの実装よりパフォーマンスは悪いけど汎用性は凄くある。 http://toro.open2ch.net/test/read.cgi/db/1396865687/21
22: 名無しさん@おーぷん [sage] 2015/06/12(金)15:11:13 ID:JTH やっと昨日から復活したよん 電力自由化やってましたわ orderbyちょろっと実装 インデックスにはまだ悩んでる パトリシアツリーもちょっとやってみたけど うまく整合するか不明 http://toro.open2ch.net/test/read.cgi/db/1396865687/22
23: 名無しさん@おーぷん [sage] 2015/06/15(月)12:03:41 ID:WIq 1です。 やっとパトリシアツリーで実装出来そうな感じになってきました。 パトリシアツリーというのはTrieの一種で文字列を高速に インデックス化します。しかも文字列圧縮できるので 極めて便利ですわ。 実際のDBとの組み合わせには配列として実装するとか プログラム中ではTerminatedで記載されている終端ノード の判別を無くすとかありますが頭のなかでは解決したっぽいです。 今回実装しようとするのはIoT向けに小さくて早いDBを作りたいと 思ったのがきっかけなので>>20さんのようにLINQとか 便利な仕組みもあるんだろうけどμCLinuxくらいで 動く事を想定してますよと。 とりあえずorderはすぐできたけど、インデックス絡めたいから こっちが先。パトリシアツリーのソースはこれ http://ideone.com/MO8DxW http://toro.open2ch.net/test/read.cgi/db/1396865687/23
24: 名無しさん@おーぷん [sage] 2015/06/19(金)12:42:14 ID:BTQ パトリシアツリー使ったインデックスができました。 他のパトリシアツリーの実装と異なり、 設定時の入力順も保持しています。 よってこれをカラムに適用すれば 常にソート順、入力順が両方取得できます。 一部同一値とか未実装のものもありますがこれと最初の簡単DB実装と合わせれば 概ねデータベースとして機能します。 terminateの配列はbooleanとしてしか使ってないのでここに値を入れて key-valueも可能 SQLとしてはgroupbyとかbetweenとか全文検索あたりはこれで出来るはずなので ちょっと後回しにします。関数レベルではSQL出来るのでこれを構文から 解釈実行するエンジンを書きます。 http://ideone.com/IXbDVB http://toro.open2ch.net/test/read.cgi/db/1396865687/24
25: 名無しさん@おーぷん [sage] 2015/06/23(火)19:42:35 ID:M45 1です。一応動きました! SQLをパースするのは基本がしっかりしてからですね まだ不安定ですので、土台がためです。 jusyo.jp/csv/document.html とりあえず上のzenkoku.csvの22カラム14万行のデータを入れてみました。 全カラムインデックスして8.94秒、1秒あたり3万項目をインデックス化できるようです しかしメモリが思ったより食うんです 速度優先で余計なリンク張ってるからしょうがないけど 文字列の20MBのデータは8MBくらいまで圧縮されますが それに関連するリンクが70MBくらいあります 半分くらいは探せばわかるものなので消せるっちゃ消せるんですが しばらく悩むことにします なのでソースはまってください http://toro.open2ch.net/test/read.cgi/db/1396865687/25
26: 名無しさん@おーぷん [] 2016/05/18(水)14:12:15 ID:ezI 1年くらい空いてしまったけど、やっと形になったので再開 インデックス化で本当に時間を使ってしまった LOUDSというデータ構造について色々やってたです 出来た事は出来たけど、細かい問題が解決しきれなくて 最近動くモノを作ろうと思えて、作りなおしました http://toro.open2ch.net/test/read.cgi/db/1396865687/26
27: 名無しさん@おーぷん [] 2016/05/19(木)14:27:47 ID:Dmy 今まではボトムアップで作ってたのですが、テーブルからデータベース参照したり マルチスレッドで動作するための仕組み等でひっかかってました 全体の構成はこんな感じです カタログクラス +データベースクラス -+テーブルクラス --+カラムクラス --+データノードクラス カタログクラスはsingletonにして、下位のクラスから使いまわせるようにします singletonのカタログクラスからインスタンスを生成するので各クラスもシングルトンに なります。一時テーブルはスレッド毎に作っては消し、作っては消しします。 テーブル毎にmutexとかクリティカルセクションとか参照カウンタを用意して読み込みは 任意、書き込みはテーブル毎にロックします。 http://toro.open2ch.net/test/read.cgi/db/1396865687/27
28: 名無しさん@おーぷん [] 2016/05/20(金)09:13:39 ID:KWC 構文解析はデータベースクラスに設置しました ただデータベースクラス自体に変更を加えるUSE DATABASEは別途実装です またDROP DATABASE等は自データベースでできないようにするのと _SYSTEMデータベースをディフォールトで作ります このDBは本来統計情報とか入れるものですが今回は存在するだけです http://toro.open2ch.net/test/read.cgi/db/1396865687/28
29: 名無しさん@おーぷん [] 2016/05/26(木)11:33:17 ID:I0n とりあえず動くファイルをアップしておきます。 http://neon.cx/up/NEON7Abdg8.zip msql.exeでコマンドラインからsqlを叩けます。 サンプルのデータベースも入ってるので よかったら見てください。 http://toro.open2ch.net/test/read.cgi/db/1396865687/29
30: 名無しさん@おーぷん [] 2016/06/06(月)16:04:56 ID:eCV とりあえずまあ動くのだけど、 テーブルコピーしてるから重い 16万件でselectするとちょっと一息 ついてしまう。検索よりロードの方が早かったりするのは.. 実体コピーしないのつくりますん http://toro.open2ch.net/test/read.cgi/db/1396865687/30
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.013s