【誰もいないから】インメモリDBを作ろう【今のうち】 (30レス)
1-

2: 2014/04/07(月)19:27 ID:vEOnylDdo(2/2) AAS
気になる点は次あたり。
・C++で実装。
・組み込みできるようになるべく単純な事しかしない。
・メモリが肥大したらそれだけで落ちちゃうからメモリ最大量固定。
・呼び出しはSQL構文使えるようにしたい。
・細かい最適化とか無視。メモリアクセスは早いしね。
DB内部については素人なんで、まずはこんなところから。
3
(1): 2014/04/08(火)20:31 ID:oB8lBSdxv(1) AAS
まぁがんばれ
陰ながら見守ってるわ
4: 2014/04/09(水)11:46 ID:F4Kee7g1T(1) AAS
>>3
ありがとう。まあ自分用なので色々とダメでも勘弁してくれ。
今はざっとしたクラス作成中。
5
(1): 2014/04/10(木)03:33 ID:WNlufLjBz(1/2) AAS
インメモリDBってのがまだピンと来ないんだけどさ、使う側から見たら速度が凄い早いDBって認識でいいの?

SQLiteとかだとプログラムから接続文字列でデータソースに
DATA SOURCE=:MEM:
とか指定すると、メモリ上でにテーブル作ったりできたけど、そういう感じのやつなんだろうか?
6: 1 2014/04/10(木)15:27 ID:lgBo0YUAM(1) AAS
>>5
基本的には電源落ちたら既発しちゃうのがインメモリDB。
実装的にはインメモリDBとそれ以外の違いはデータ保持の主体が
列毎なのか行毎なのかというのが大きいようです。
メモリ節約するために列毎にzipするという実装もあるみたいです。

ということで、ある1カラムを常にソート済で保持しておくのが
基本となるかと思い漠然とテストプログラム書いてます。
遅くてすまない
7: 2014/04/10(木)23:59 ID:WNlufLjBz(2/2) AAS
ゆっくりどうぞ

つ _旦~~
8: 1 2014/04/15(火)14:34 ID:tfclwizYC(1) AAS
効率の良いインメモリDBを作るとしても、実験から入るのが常なので
うまい書き方ないか試行錯誤してました。

結局リレーショナル・データベースとはテーブルを返すものであるという
理解のもとにinsert,selectできるものを作ってみました。
これから内容が変わっていくかもしれませんが基本はこんな感じです。
外部リンク:ideone.com

実行するとinsertされたものがselectされ表示されます。

最初はリストかTrieを高速化するつもりだったんですがボトルネックをわかりやすくした方が後に便利と
思い直してまずは平たく作ってます。次はjoinとかやります。
9: 1 2014/04/21(月)17:37 ID:QN2kw8ix5(1) AAS
すいません。修羅場ってます
10: 2014/04/23(水)21:53 ID:bpVvrHr2Q(1) AAS
ゆっくりマイペースで進めればいい
前に進んでさえいれば、確実に目標には近づいている
11: 2014/07/07(月)19:46 ID:YkjIc2l9U(1/2) AAS
落ちてなかった!
やっと仕事が一段落したので作成再開。
selectにしろwhereにしろ一時的なtableを作成するという考え方を採用すると
全てがクリアになります。
joinの前にテーブルのカラムの持ち方とwhereを実装します。
カラムは今までは名前だったけどテーブル名と名前で管理する事にします。
joinしたときとかに区別できるように。後々の演算にも便利。カラム名だけで参照
した場合には、登録順で一番最初にマッチした名前になります。カラムには将来の拡張の
ために数値、文字などのenumも持たせておきます。

あと一応複数のテーブルを扱えるようにDatabaseクラスも用意します。Databaseクラスは
省12
12: 2014/07/07(月)19:47 ID:YkjIc2l9U(2/2) AAS
ありゃ。ideoneのソース間違えました。
こちらから見てください。
外部リンク:ideone.com
例題はかわいいリレーショナル・データベースの
ものにしてみました。
13
(1): 2014/07/07(月)20:37 ID:mDpRDAyXy(1) AAS
今オラクルの勉強してる俺に取ってかなりタイムリーなスレだ
14: 2014/07/08(火)09:55 ID:rMFc8YmDB(1) AAS
>>13
ありがとう。不明な点とかあったら補足します。
今日はjoin実装します。joinって何?ってところからスタートですがw
15: 2014/07/09(水)20:39 ID:naIqrL5h5(1) AAS
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にて実装されてるようなのでそれなりに早いはず。
省13
16
(1): 2014/07/09(水)23:43 ID:PzoSUll2D(1) AAS
オラクルとそんな変わらないんだね
natural join
join using
join on
inner join
outer join
だっけ。
そしてnatural joinとjoin using
で結合に使われる列に、表別名は使えないという制約があるという…、
17: 2014/07/10(木)12:19 ID:7YX29kERu(1) AAS
>>16
join usingは使った事なかったです。複数テーブルで指定された項目名が
同値のものをつなぐんですね。エイリアス使うと構文解析が追いつかないんでしょうか
実装するとしても確かに困りますね
join = inner join
left join = left outer join
right join = right outer join
なんですね。cross joinとかnatural joinは理解してないから実装しないかなぁ

通常のDBだとデータの対象はハードディスクになりますからBツリーとかディスク
アクセスを高速に行えるように作りますがインメモリDBでは省メモリでなるべく
省2
18: 2014/07/15(火)11:03 ID:KxYr2ZslW(1) AAS
orderというかデータの持たせ方に悩んでます
どうせインメモリなんだからデータはすべて探索可能な
ハッシュとかスキップリストでの実装はどうかと考えてます

いい考えがでないようならまずはリストで実験してみます
19: 2014/09/16(火)00:38 ID:T3HpIYnP9(1) AAS
進んでますか?
20
(1): 2014/10/05(日)18:48 ID:BAUn6XcwD(1/2) AAS
色々やったけどLINQで実装してるよ。
今はプロファイルなどのデバッグ情報埋め込むところの実装。
21: 2014/10/05(日)18:50 ID:BAUn6XcwD(2/2) AAS
LINQでやるとVisual Studioの支援受けられるし.NETのクラス全部使えるし。
データ型を限定した1さんの実装よりパフォーマンスは悪いけど汎用性は凄くある。
1-
あと 9 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.033s