オンメモリ高速KVSをjavaのstatic変数で実現する

やりたいことは、メモリの高速さをフルに活かした超シンプルなKVS。
用途は、機械学習アルゴリズムのモデル用。
・大量のKeyValue値を高速に読み書きできること。
・モデルはシリアライズを使って、ファイルに保存/読み込みもできるようにしたい。
・サーバを再起動したり、しばらく使わないときは、ファイルにしておく。
・モデルを更新したい時もメモリ上のデータに対して高速に操作できる。
そういうシンプルで高速なオンメモリKVSが欲しかった。


しかし、以前にも書いたように、メモリの高速っぷりを活かしたシンプルなKVSはありそうでなかった。
Redisはネットワーク越しに使われることが前提とされているとかなんとかで、その辺りがボトルネックになって素のメモリ処理に比べると桁違いに遅かった。
Tokyo CabinetはTokyo Tyrantと違ってインターナル用途が想定されているものの、レコード数が1億くらいに増えると急に重くなって使い物にならなくなった。(もしかしたらパラメータ調整がんばればいけるかも という印象)

じゃあもういいってことで、pythonの共有メモリを使って実現しようとしたが、子プロセスを管理したりとかいろいろ厄介そうだったのでこれも断念。


で、行き着いたのが、javaのstatic変数。そして、そのデータを使うのもjavaに限定。
同じプロセス内なので、素のメモリ操作と同じレベルの高速性が期待できる。
その代償として、そのデータの使用はすべて同じJAVAアプリケーション内に限られるので、機械学習の計算ロジックなどはすべて同じアプリケーション上に書く。
もはやKVSでもなんでもないわけだが、、

で、それをGlassfishなどのインスタンスとして実現する。
計算結果を返すインターフェイスなんかも用意してあげてAPI化する。


でもやっぱりなんか違和感がある。ただメモリの内容を他のプロセスと共有するだけのことがどうして簡単にできないんだろう

JSON形式のマルチバイト文字(UTF16)をUTF8変換する

JSON系モジュールを使わずに直接まともに見れる形に変換したいが、なかなか情報がなかった。

use Encode;

## test
print encode("UTF-8", "\x{3042}"); ## "あ"

## 変換したいUTF16な文字列
my $str = '\u3042';

$str =~ s/\\u(:xdigit:{4})/chr eval "0x$1"/eg;
$str = encode("UTF-8", $str);
print "$str¥n"; ## "あ"

参考:
utf16の記号のutf8へのエンコード(もしくはマッチ又は削除)がう - Perl | 教えて!goo

scale_x_datetimeの引数がないとか言われて使えない

  • 問題

scale_x_datetimeの引数がないとか言われて使えない

p1 <- p1 + scale_x_datetime(major="2 weeks")
以下にエラー continuous_scale(aesthetics, "datetime", identity, breaks = breaks, :
使われていない引数 (major = "2 weeks")

  • 解決

Google グループ

require(scales)

で解決

Neo4jインストールなど

情報推薦エンジンつくるにあたって、いろいろやってみたところ、KVSやRDBではパフォーマンス的にきついことがわかった。
ので、まずはグラフDBを導入したい。

グラフデータベース「Neo4j」の 導入の導入



というわけで手順

neo4jインスコcentOS
http://yum.neo4j.org/

起動など
[root@vb]# service neo4j start
[root@vb]# ps aux | grep neo4j
[root@vb]# service neo4j stop
[root@vb]# service neo4j restart

やめ

ダウンロードしてくるタイプでインストール。
ただし、一般ユーザでやると変なことになったので、rootで、やった。

./bin/neo4j startででてくるWARNINGはこれで解決
ubuntu - neo4j and max open files - Stack Overflow

Starting Neo4j Server...process [4669]... waiting for server to be ready............ OK.
http://localhost:7474/ is ready.

WARNINGきえた

localhost:7474を見るとクオリティの高いチュートリアルが受けられる。

女性と男性の性的嗜好の違い|「アブないデータ分析」 by あんちべ

f:id:ukonlly:20141221195943p:plain

右のカードほどレアリティが高い。

女性向けのカードイラストでは、男性の顔がアップしたものほど高い訴求力を持つが、逆に男性向けのイラストでは身体全体を描写したものの方がよいという違いがあるとのこと。

男性向けでは描かれた女性の胸や尻や太ももの露出が重要で、その局所だけをアップすることはできないので、必然的に体の広範囲が描写したアングルとなってしまう。
一方で、女性向け(ボーイズラブ系)ではキスの可能性や親密度を高めるために顔にアップするほど性的訴求力が高まるという。


参考

第7回ニコニコ学会βシンポジウム 〜日常に埋め込まれるニコニコ学会β〜 - 2014/12/20 13:00開始 - ニコニコ生放送

ノードに画像を描画

## image
rasters <- c();
for(v in V(g)$name){
  jpg <- paste("/Users/ukonlly/data/", v, ".jpg", sep="");
  url <- paste("file://", jpg, sep="");
  
  if(file.exists(jpg)){
    con <- url(url, open="rb")
    bin <- readBin(con, what="raw", n=10^6)
    close(con)
    rast <- readJPEG(bin, native=TRUE);
  } else {
    rast <- as.raster(matrix());
  }
  rasters <- c(rasters, list(rast));
}
V(g)$raster <- rasters;


## plot
plot(g, vertex.shape="raster",
     layout=layout.auto,
     margin=.2,
     edge.label.family="Hiragino Kaku Gothic Pro W3", 
     vertex.label.family="Hiragino Kaku Gothic Pro W3",
     vertex.size=8, vertex.size2=8,
     vertex.label.dist=2, vertex.label.degree=0,
);


参考

R : Display Image at Exact Node in Igraph - Stack Overflow

Facebook data collection and photo network visualization with Gephi and R

Facebook data collection and photo network visualization with Gephi and R