Forums: Developers (Thread #22027)

SequenceManagerの内部設計について (2009-03-14 13:15 by my04337 #42545)

現在、mikurion.SequenceManager.Base.*のコーディングが終了したところですが、レイヤ、バンク、シーケンスを内部でどのように保存するかについて意見を聞きたいため投稿しました。

前提条件は以下のとおりです。
・ノート命令、ボリューム変更命令等はISequenceMessageクラスから派生。
・SequenceManagerはスレッドセーフにする必要がある(少なくともUI,シーケンサから同時アクセス)。
・SequenceManager内のデータは、UIからは読み書き、シーケンサからは読み取りのみされる。
・シーケンサが再生するデータは、最新のものである必要はない(1小節分をまとめて取得してもよい)。

この場合、UIからは編集しやすく、編集中でもシーケンサからの読み出しでエラーが発生しない構成にする必要があるため、自分は以下の構成を考えています。

1.設定をsqliteを用いてDB(ファイル)に保存する。
2.java.util.List等を用いてメモリ内に保存する。

1の方法については、排他処理が自動的に行われる、譜面の保存処理の実装がいらない(すでにされている)メリットがあるかわりに、SQL文を用いる必要があるのとオーバーヘッドが大きくなる、外部のライブラリを使う必要があるというデメリットがあります。

2の方法については、排他処理が自動では行われない、譜面の保存処理の実装が必要(シリアライズで比較的簡単に実装可能)といったデメリットがある代わりに、クラスのメソッド呼び出しで操作可能なのとメモリ上に記録されるため高速であるというメリットがあります。

どちらの方法についても、UI側ではどのイベントオブジェクトがどれに対応しているのかを把握しないと編集/表示できないため作業コピーを保持する必要があるという問題があります。

実装するに当たって上記の方法以外にもいいものがあればどんどん出してください。
また、上記の方法に質問があったりどちらがいいといった意見があればコメントお願いします。

RE: SequenceManagerの内部設計について (2009-03-19 01:35 by onodes #42621)

こんにちはonodesです。
この場合の排他処理について詳しくご教授いただきたい。
Reply to #42545

RE: SequenceManagerの内部設計について (2009-03-20 08:31 by my04337 #42654)

tomoteruです。

1のsqliteを使用する場合は、sqlite自体が排他処理を行っているため、特に必要にはなりませんが、sqliteのロックはファイルに対するロックとなっているため、頻繁に細かく読み出すことは速度面からかなり苦手であると思います。

2のListを用いる場合は、言語側での排他処理が行われないため、シーケンスマネージャやレイヤなどの側で排他処理を行う必要があります。
とはいえ、Javaではsynchronized(C#でのlock)を用いることで、単純に排他処理したい区間を
synchronized(排他処理したいオブジェクト){...}
という形でくくることで行えます。
こちらの方は速度の点ではsqliteと比較しても桁違いに高速で、わざわざSQL文を発行しなくてもよいためJavaの文法内で書くことが出来、コンパイル時に構文エラーを検出できる利点があります。

自分としては2がおすすめですね。
Reply to #42621

RE: SequenceManagerの内部設計について (2009-03-22 15:15 by circussion #42690)

見るのが遅くなって申し訳ないです、circussionです。

大雑把な意見になってしまいますが、外部ライブラリで変に制限が掛かったり、無理矢理なプログラムを作成するくらいなら2のメモリ内保存の方が、比較的副作用が小さい気もしますが…気のせいでしょうかね。

保存の為の速度は速いに越した事はありませんが、正しく保存される・保存形態が汎用的である方が何かと便利な気がするので、方法としては2の方がいいかな?とは思います。

何となくでしか把握する事が出来なかったので、論点として質問意見がずれてたら申し訳ないです。
Reply to #42545