ongaeshi
ongae****@gmail*****
2014年 3月 3日 (月) 23:59:44 JST
おんがえしです。 やりたかったことはおすすめの3.の方法で出来そうです! 今回はGroongaにpdfファイルのパスを格納して、 Sinatraのsend_fileと組み合わせて使ってみようと思います。 ※ 1.の Groonga::Encoding::NONE を使う方法も面白そうですね。 あまりサイズの大きくないアイコン画像の保存とかだったら 結構便利に使えるんじゃないかと思っています。 dumpコマンドで全情報を保存出来るのが便利だなぁと。 ありがとうございました! 2014年3月3日 11:02 Kouhei Sutou <kou****@clear*****>: > 須藤です。 > > In <CA+vpKirWc0UaWFr__as72iG7bu2P7HYh7soWoi1d+0tZrMkn=w****@mail*****> > "[groonga-dev,02164] Groongaにpdfのようなバイナリファイルを格納したい" on Sat, 1 Mar 2014 21:33:07 +0900, > ongaeshi <ongae****@gmail*****> wrote: > >> # Droonga 1.0 おめでとうございます! > > ありがとうございます! > >> Groonga(実際にはRroonga)にpdfやxmlといったバイナリファイルを >> 格納したいと考えています。 >> >> バイナリを検索したいという要求は特になくて、 >> ストレージとして他のカラムと一緒に格納して >> Webアプリでpdfとして表示出来るようにしたいと思っています。 >> >> http://groonga.org/ja/docs/reference/types.html >> >> 辺りに目を通してみたのですが、上手い方法が思いつきませんでした。 > > いくつかやり方があるんですが、個人的には最後の「Groongaには > パスだけ格納する」がオススメです。 > > 1. Text型を指定して、カラムにアクセスする前後で > Groonga::Contextのエンコーディングを > Groonga::Encoding::NONEにする > > Groongaでは「1文字」を正しく扱うためにエンコーディング情報を > 持っています。これは、カラム毎に持っている情報ではなく、 > Groonga::Contextが持っている情報です。1つのGroonga::Context > は同時に1つのデータベースしか扱えないので、データベース内で > エンコーディングを統一する必要があります。 > > と、ここまでが一般論です!実は、Groonga::Contextのエンコーディ > ングは処理の途中で変えてもよいです。ただし、整合性を保つのは > ユーザー側の責任です。例えば、UTF-8のテキストを扱うときに > Shift_JISというエンコーディングを指定されてうまく動かなくて > も、それはGroongaの責任ではなく、ユーザー側の責任、というこ > とです。 > > 実際、Mroongaはコンテキストのエンコーディングをころころ変え > ています。これは、MySQLではカラム毎にエンコーディングが違う > からです。 > > RroongaでもGroonga::Contextのエンコーディングを変えることがで > きるので、バイナリーデータを格納したいカラムをText型で定義し、 > そのカラムにアクセスする前後でエンコーディングを変更します。 > > original_encoding = context.encoding > context.encoding = :none > record[binary_column_name] # -> ASCII-8BIT String > context.encoding = original_encoding > > 欠点は見ての通り、めんどくさいことです。メソッドでラップして > いるならアリだとは思います。例えばこんな感じです。 > > class User > def initialize(record) > @record = record > end > > def profile_image > change_encoding(:none) do > @record.profile_image > end > end > > def profile_image=(data) > change_encoding(:none) do > @record.profile_image = data > end > end > > private > def context > @record.table.context > end > > def change_encoding(encoding) > _context = context > original_encoding = _context.encoding > begin > _context.encoding = encoding > yield > ensure > _context.encoding = original_encoding > end > end > end > > あと、Groongaのメモリ使用量が増えます。バイナリーデータは総 > じて大きめなので、そこそこ増える気がします。 > > 2. Text型を指定して、カラムの値はBASE64にしてASCIIのテキスト > として扱う > > バイナリーデータだったとしても、Groongaに入れるときにはバイナ > リーデータではなくするという方法です。 > > これも、めんどくさいのとメモリ使用量が増えることが欠点です。 > あと、データ量が3割くらい増えます。あと、あと、変換処理が入る > ので多少遅くなると思います。 > > require "base64" > > class User > def initialize(record) > @record = record > end > > def profile_image > Base64.decode64(@record.profile_image) > end > > def profile_image=(data) > @record.profile_image = Base64.encode64(data) > end > end > > > 3. Groongaにはパスだけ格納する > > バイナリーデータはファイルとして保存し、Groongaにはそのファ > イルのパスだけ格納します。 > > これだと、Groongaのメモリ使用量は増えません。が、別の意味で > めんどくさくなります。ファイルを管理しなければいけないからで > す。サーバーが複数台になったらさらに大変です。 > > ただし、もし、PDFファイルがすでにファイルシステム上にあるファ > イルなら、そんなに面倒ではありません。プログラムがファイルの > 作成・削除などをする必要がないからです。 > > また、大抵のWebアプリケーションフレームワークはファイルを返す > ための専用のAPIを持っているので、Groongaにパスしか入っていな > くても、WebアプリケーションがPDFを返すのは簡単なはずです。例 > えば、Sinatraならattachmentやsend_fileといったAPIがあります。 > > Rroongaは1台のマシンで動くものなのでファイル管理がそんなに面 > 倒にならない気がします。なので、この方法がオススメです! > > > -- > 須藤 功平 <kou****@clear*****> > 株式会社クリアコード <http://www.clear-code.com/> (03-6231-7270) > > Groongaサポート: > http://groonga.org/ja/support/ > パッチ採用はじめました: > http://www.clear-code.com/recruitment/ > コミットへのコメントサービスはじめました: > http://www.clear-code.com/services/commit-comment.html > > _______________________________________________ > groonga-dev mailing list > groon****@lists***** > http://lists.sourceforge.jp/mailman/listinfo/groonga-dev -- /****************************************** ongaeshi MAIL: ongae****@gmail***** WEB: http://ongaeshi.me Twitter: http://twitter.com/ongaeshi ******************************************/