Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://kovayashi.blog120.fc2.com/tb.php/78-9ff27459

-件のトラックバック

-件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

out of memory (SQLite3::SQLException)

sqlite3に500MByte越えのバイナリデータを突っ込んでみると、


out of memory (SQLite3::SQLException)


がでた。

こちらの方法ではダメなようなので、

SQLite3::Blob.new(val) を捨てて、Amalgalite::Blobを使ってみた。

Amalgalite::Blobのマニュアルによると、

:io => "something with .read and .length methods",

とあるが、readとlengthをサポートするクラスなんて、知らないなぁ・・・

なので、そんなクラスを作ってやる。


#!/usr/local/bin/ruby
require 'rubygems'
require 'amalgalite'

class Stream
def initialize(arg)
@data=arg
@p=0
end

def read(size)
buf=@data[@p,size]
@p+=size
buf
end

def length
@data.length
end
end

path='./hoge'

DBFILE='./hoge.db'

db=Amalgalite::Database.new(DBFILE)
blob_column = db.schema.tables['table01'].columns['val']

f = open(path,'rb')
b=Stream.new(f.read)
f.close

blob=Amalgalite::Blob.new(
:block_size=>1024*1024*20,
:io=>b,
:column=>blob_column)

db.execute('replace into table01 (path, val) values(?, ?)',path,blob)



:block_sizeはデフォルトで8192となっており、処理時間が遅かったので、テキトウに大きな値を入れてみると、早くなった。
:block_size=>b.lengthとしても、問題なく動き、 :block_size=>1024*1024*20の時と大差なかった。

実行時にカレントに作業用ファイルを作るのが気に入らないが、[out of memor]の問題はアラウンドできた。

読み込みの方は、こちらを使えば、sqlite3でも所謂ストリームが実現できる事になる。

因みにストリームはMySQLなどでも苦労するようである。




この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://kovayashi.blog120.fc2.com/tb.php/78-9ff27459

0件のトラックバック

0件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

Appendix

プロフィール

kovayashi

Author:kovayashi
・嫌いなもの
 →好きなもの

・インストール
 →バンドル
・バックアップ
 →アップロード
・努力
 →チート

最近のトラックバック

ブログ内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。