Author Archives: susumuis

About susumuis

メイドカフェによく居るWebエンジニア

64bit環境でなんかheapを多く消費するなあと思ったら

かいつまんで話すと、100KBくらいのXMLデータをモデル化したデータ*1がJavaのheap上で10MBになった!なぜか!という話です。

DOMのような構造データは要するにこんなデータ構造を持っていれば良いです。


class Node { Map<String, String> attribute; QName qName; } class QName { URI uri; String tagName; }

URIは適切にキャッシュを共有する必要があります*2が、そこさえ気をつければ、必要な実データは要するに元のXMLテキストデータとあまり変わらない。改行コードとインデントがなくなるのでむしろ軽くなるはずです!

となると、オーバーヘッドはオブジェクトの管理データだと予想しました。
https://www.ibm.com/developerworks/jp/java/library/j-codetoheap/
を読んだ程度の理解ですが、64bitモード下でのJavaのオブジェクトは結構大きなデータなのですね。100byte以上とはでかいですね。そこで、HotspotVMには圧縮OOPというものが搭載されていて、
http://docs.oracle.com/javase/jp/7/technotes/guides/vm/performance-enhancements-7.html
>> 6u23 リリースより前の JDK 6 でこの機能を有効にするには、java コマンドで -XX:+UseCompressedOops フラグを使用します。
とのことです。つまり、

  • 32bit VMで十分なメモリの量だったら、32bit VMを使ったほうが有利(〜2GBくらいか?)
  • 64bitが必要で、Java 6u13以前だったら、VMのバージョンアップを検討すべき
  • 64bitが必要で、Java 6u14以上6u22以前だったら、-XX:+UseCompressedOops フラグを使用か、VMのバージョンアップを検討すべき

というか、GCも進化してるし、Java VMは最新を使おう!

*1:正確に言えば、MayaaのSpecificationCacheのことですが直接関係ないのでここでは深く突っ込ません

*2:そうしないと1タグ毎に "http://www.w3.org/1999/xhtml" とかを保持することになる

PostgreSQLを使っていて、カラムの中にカンマ区切りデータを入れてしまった時のノウハウあれこれ

一つのカラムのなかに、カンマ区切りでデータを入れてしまったとします。そんな時に役立つテクニックをここにまとめます。

言ってみれば第一正規形ですらないテーブルデータと言えるので、いかがなものかとも思いますが、それはそれとして。))前提として、値に","は含まないこととし、エスケープとかは考えないことにします。

カンマ区切りを分離してテーブルとしてselectする(regexp_split_to_table)

select regexp_split_to_table('one,two,three', ',');

結果

regexp_split_to_table
---------------------
one
two
three
(3 行)

参考:http://blog.cloudpack.jp/2011/10/server-news-postgres-comma-separate.html

複数行(1列)のテーブルを結合してカンマ区切りにする(array_to_string)

select c1 from t1

の結果が

c1
-----
one
two
three
(3 行)

のとき、

select array_to_string(ARRAY(select c1 from t1), \',\')

結果

array_to_string
---------------
one,two,three

参考:http://postgresql.g.hatena.ne.jp/iakio/20080427/1209276667

カンマ区切りの中にある要素が含まれているかどうかを調べる(',' || column_name || ',' like '%,' || keyword || ',%')

一個目の方法でexistsとかやってもいいのですが、いかにも遅そう。そこで、この方法を使うと、インデックスこそ使われませんが程々高速にできる(はず)

select \',\' || \'hoge,fuga,piyo\' || \',\' like \'%,\' || \'hoge\' || \',%\'

結果

?column?
--------
t
(1 行)
select \',\' || \'fuga,piyo\' || \',\' like \'%,\' || \'hoge\' || \',%\'

結果

?column?
--------
f
(1 行)

JJUG CCC 2013 Fall で発表してきました

共同発表者のWebデザイナーさんがスライドを作ってくれたのですが、残念なことに、はてなダイアリーに埋め込むことはできないみたいですので、以下よりリンクをしてみて下さい。


テンプレートエンジンを利用してプログラマーとWebデザイナーが共同作業をする上で大切なこと

前回ご好評を頂いた(僕じゃなくて、Webデザイナーさんの)発表について、
「本当はフルバージョンをJJUG CCC 2013 SpringのCfP応募したんだけど落ちたんですよね」
という僕の情けないつぶやきをしてるところ、JJUGの重鎮様にお誘いを頂いたというのが発表の経緯なのであります。
お陰で 僕が美人Webデザイナーさんと半日一緒に過ごせるという嬉しいイベントが年に二度も訪れ Java界隈のエンジニアの皆さんにWebデザイナーさんの視点という、普段は得られない意見を届けられるという、有意義な発表が実現したのであります。
そこには40人くらいいたんでしょうか?少なくとも、去年の僕の発表よりは人が集まりました。運営の方には「このセッションは、今回の注目のセッションでして、ある意味永遠のテーマですから、みんな興味を持っていらしてるんですよ」と、良いプレッシャーを与えて下さって、とても楽しく発表を始めることができました。意欲的な質問をかなり頂けたので良かったです。

過去に思いをはせるようなことは、前回のエントリでしているので、特に繰り返しませんが、この発表が成功したら、「発表してよかったな」というレベルを超えて、「この3,4年ばかし仕事していてよかったなー」という思いでいます。

発表の中で「プログラミングできないのにプログラム作ってるみたい」と言ってくれましたが、実は個人的に一番うれしい言葉です。こういうことをしたくて一時は開発環境でも作ってる会社に就職したいなと思っていた時期がありました。今の仕事ができて本当に良かったと思います。一方で後半の方は、要するに、マネージメントの領域に入ることなので、どんな技術も最後はここに行き着くのだなと思います。自分はイマイチ苦手としていましたが、担当者間の確執やいざこざも後から振り返ってみれば楽しい日々だと思います。

チームで仕事するって楽しいよね。そう思っていれば、どんな仕事もうまくいくんじゃないかなと思ってしまいます。