棚からパルチャギ

日々の雑記、ニュース拾いとか

2009. 08. 14

iPhone 3GSのSQLiteベンチマーク
4万件程度のデータをほどほど高速に扱いたいなあと思って、iPhoneのSQLiteがどの程度の性能出せるのか検証。

ベンチマークの内容は公式の速度比較の項目とだいたい同じもの。5回試行した平均とってます。 比較対象がないのも微妙なので、公式の数値と開発環境(MacBook Core2Duo 2.1GHz/4GB Memory)上のiPhoneシミュレータの数値も掲載。単位は秒。

テスト内容 公式 iPhone
(Simulator)
iPhone
(3GS)
Test 1: 1000 INSERTs 3.823 2.084 16.668
Test 2: 25000 INSERTs in a transaction 0.764 0.578 4.288
Test 3: 25000 INSERTs into an indexed table 1.778 0.887 6.181
Test 4: 100 SELECTs without an index 3.153 0.001 0.005
Test 5: 100 SELECTs on a string comparison 4.853 0.001 0.008
Test 6: INNER JOIN without an index 14.473 0.000 0.000
Test 7: Creating an index 0.552 1.312 2.186
Test 8: 5000 SELECTs with an index 1.872 0.016 0.238
Test 9: 1000 UPDATEs without an index 0.562 0.241 1.915
Test 10: 25000 UPDATEs with an index 1.883 0.936 6.859
Test 11: 25000 text UPDATEs with an index 1.386 0.803 5.712
Test 12: INSERTs from a SELECT 1.179 0.689 4.020
Test 13: INNER JOIN with index on one side 0.371 0.000 0.000
Test 14: INNER JOIN on text field with index on one side 0.383 0.000 0.000
Test 15: 100 SELECTs with subqueries. Subquery is using an index 7.877 0.000 0.005
Test 16: DELETE without an index 0.528 0.257 1.538
Test 17: DELETE with an index 0.866 0.959 5.446
Test 18: A big INSERT after a big DELETE 0.973 0.455 3.362
Test 19: A big DELETE followed by many small INSERTs 0.155 0.080 0.521
Test 20: DROP TABLE 0.138 0.031 0.171


更新系は多少遅いものの、SELECTする分にはシミュレータ並みの速度が出たりするのはフラッシュメモリの恩恵なのかなあ。 もともとデータは事前に用意するつもりだったので全然実用的に使えそうな気がしてきた。

データベースライブラリにfmdbを使っています。 ソースコードはベタ書きで結果をNSLogで出力する恥ずかしいものなので、欲しい方はメールください。。。
awsxomのProduct Advertising API対応
2009/08/15以降、AmazonアソシエイトのAPIは署名認証が必要になったのでawsxomのProduct Advertising API対応版。 本体のみ。 ライセンス書いてなかったので勝手にやった。今は公開している。

xreaにDigest::SHAが入っているのか分からなかったので、Digest::SHA::PurePerlをコピーして以下のような感じで使ってます。 導入済みの人は特に弄る必要はないはず。
use lib "$blosxom::plugin_dir/lib";
use Digest::SHA::PurePerl qw(hmac_sha256_base64);
雑記
もともと買ったものとかしか書いてなかったから、そういうのがtwitterで事足りてしまうと見事に書くことがなくなってしまうなあ。

なんかしよう。
コミケ行き忘れた。1日目。

2009. 08. 10

教訓
ぐぐるよりも前に公式ドキュメント読みましょう。

はい。


まあ、iPhone Dev Centerの解説も微妙に古かったりでなんともだったりするのですが。
Code Signingに登録したProvisioning Profileが表示されないとか
Organizerにドラッグ&ドロップするか、+ボタン押して追加で一見登録されたように見えるのに、Code Signingの項目では選択できないという罠。

Profile用のディレクトリが存在しないと正常に登録されないのか、ダメな場合は自分でディレクトリ作成してコピーする必要があるみたい。
$ mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles $ cd ~/Library/MobileDevice/Provisioning\ Profiles $ mv ~/Downloads/Develop.mobileprovision .
iPhone OS 3.0.1にしたらXcodeが認識しないとか
このバージョンには対応していないので最新版のXcodeに更新してねと言われる。
The version of iPhone OS on “iPhone” does not match any of the versions of iPhone OS supported for development with this copy of Xcode. Please restore the device to a version of the OS listed below. If necessary, the latest version of Xcode is available here.

3.0用のデバイス定義が流用できるので、シンボリックリンクは自分で貼る必要があるみたい。 こういうのバージョンアップで対応とかしないものなのかしら。
$ cd /Developer/Platforms/iPhoneOS.platform/DeviceSupport $ ln -s 3.0\ \(7A341\) 3.0.1
iPhone開発メモ
はまったところくらいは書き残していこうと思うわけで。

本は「iPhoneデベロッパーズクックブック」だけ買いました。通称エリカ本。良書。 あとの情報はネットの情報で結構とかなるような気がしますね。 むしろ情報多すぎてどれから手をつければいいのか分からない気がしますが。 Objective-Cはサンプルコード書き写しながら覚える感じで。

2008. 12. 15

openpear/Net_Q4M

Q4MのPHPインターフェースラッパを書いたのでopenpear.orgで公開してみました。

基本的な使い方はこんな感じで。

$queue = new Net_Q4M(); $queue->connect('mysql://user:pass@localhost:3306/database'); $row = $queue->dequeue('my_queue'); if (process_row($row)) { $queue->end(); } else { $queue->abort(); } $queue->disconnect();
dequeue()を呼ぶとキューのレコード情報が返ります。 内部的にはqueue_wait()を発行しているので、取得したキューの値はこの接続のみが扱えることになります(OWNERモード)。

キューの値は配列で返るので適当に処理します(上のサンプルだとprocess_row()のところ)。 処理に成功した場合はend()を呼ぶことでキューから値を削除します。 逆に失敗した場合はabort()を呼ぶと値はキューに戻され、他の接続からも参照可能になります。

取得したキューの値はend()が呼ばれるか次のdequeue()が呼ばれた時点で削除されます。 また、end()もabort()も呼ばれないまま切断された場合は、取得した値はキューに戻ります。

// キューへの接続 $queue->connect('mysql://user:pass@localhost:3306/database'); $queue->connect('mysqli://user:pass@localhost:3306/database'); $queue->connect('pdo_mysql://user:pass@localhost:3306/database');
接続にはPEAR::DBと同様の書式のDSNを指定します。
phptypeにはmysql/mysqli/PDO(mysql)の3種類が指定可能です。

// キューから値を取得 $queue->dequeue('my_queue', 5); $queue->dequeue('my_queue', 'my_queue2', 'my_queue3', 10);
dequeue()を発行してもキューに値がない場合、値がinsertされるまで一定時間待機します。 このタイムアウト時間はdequeue()の最後の引数で指定します。デフォルトは10秒間待機します。

また、Q4Mでは取得先のキューを優先度順に複数指定する事が可能です。 この場合はdequeue()の引数に取得先のキュー(テーブル名)を優先度の高い順に指定します。 キューを複数指定する場合、タイムアウト時間を省略することはできません。

// キューに取得条件を指定 $queue->dequeue('my_queue:id=1000'); $queue->dequeue('my_queue:score<30');
キューに取得条件を付加する場合は、テーブル名の後ろに「:」で条件式を繋いで記述します。 条件指定には様々な演算子が使用できるので詳しくはQ4Mのドキュメントを参照してください。

// キューに値を追加 $data = array( 'user_id' => 1000, 'message' => 'Hello!' ); $queue->enqueue('my_queue', $data);
キューに値を追加するときはenqueue()を使用します。
テーブルのカラムに対応したキーと値を保持する連想配列を引数に渡して実行します。

// キューの状態を取得する $result = $queue->status(); var_dump($result);
status()を呼ぶとキューの状態を保持する配列が返ります。 SHOW ENGINE QUEUE STATUS; の実行結果で得られる情報を連想配列化したもので、Queue::Q4M::Statusを見てなるほどなーと思って真似してしまいました。

ということで、リポジトリは誰でも編集可能なはずなので適当に弄ってあげてください。

2008. 12. 14

MacBookにQ4Mをインストールしたメモ書きの補足
make test について省略したので追記。
というか長くなったので別エントリにしてみた。DBD::mysql入れるのが面倒だった。。。
$ sudo cpan cpan> install Data::Compare cpan> install DBD::mysql
DBD::mysqlのビルドは失敗するので、LeopardにMySQLとDBD::mysqlを入れる方法を参考にmakeしなおす。
$ sudo ln -s /opt/local/lib/mysql5/bin/mysql_config /usr/local/bin/mysql_config $ sudo su - # cd /var/root/.cpan # cd build/DBD-mysql-XXXXXXXX # perl Makefile.PL \ --cflags=-I/opt/local/include/mysql5/mysql \ --libs="-L/opt/local/lib -L/opt/local/lib/mysql5/mysql -lmysqlclient -L/opt/local/lib -lz -lm -L/opt/local/lib -lssl -lcrypto" # make # make install
自分の環境だけかもしれないけど、/opt/local/bin/perl と /usr/local/bin/perl がどちらも入っていて後者だと@INCが違うところを参照してしまうので、テストスクリプトのperlパスを修正する。
$ cd /usr/local/src/q4m-0.8.3 $ vi run_tests.pl - #!/usr/local/bin/perl + #!/opt/local/bin/perl
make test する。
$ DBI='dbi:mysql:database=test;host=localhost' \ DBI_USER='username' \ DBI_PASSWORD='password' \ MYSQL_UNIX_PORT=/opt/local/var/run/mysql5/mysqld.sock \ make test ... Multireader benchmark result: Number of messages: 6400 Number of readers: 32 Elapsed: 25.878 seconds Throughput: 247.315 mess./sec. ... Multi-reader-writer benchmark result: Number of messages: 6400 Number of readers: 32 Elapsed: 43.944 seconds Throughput: 145.641 mess./sec. ... Multi-reader-writer benchmark result under semi-starvation: Number of messages: 6400 Number of readers: 32 Elapsed: 96.602 seconds Throughput: 66.251 mess./sec. ... All tests successful. Files=17, Tests=68921, 2240 wallclock secs (20.83 usr 2.26 sys + 150.25 cusr 22.16 csys = 195.50 CPU) Result: PASS
ちなみに、上のは--with-sync=fcntlの場合のベンチマーク(Cure2Duo 2.1GHz/Mem 4GB)。
--with-sync=fsyncにした場合はこんな感じ↓
... Multireader benchmark result: Number of messages: 6400 Number of readers: 32 Elapsed: 1.725 seconds Throughput: 3711.007 mess./sec. ... Multi-reader-writer benchmark result: Number of messages: 6400 Number of readers: 32 Elapsed: 2.724 seconds Throughput: 2349.228 mess./sec. ... Multi-reader-writer benchmark result under semi-starvation: Number of messages: 6400 Number of readers: 32 Elapsed: 3.445 seconds Throughput: 1857.784 mess./sec. ... All tests successful. Files=17, Tests=68921, 289 wallclock secs (17.33 usr 2.06 sys + 144.66 cusr 20.77 csys = 184.82 CPU)
10倍以上速いよ!! この辺の話なのかな。
試験環境なのでデータ飛んでも困らないし、当面はfsyncのままでいいような気がする。
MacBookにQ4Mをインストールした

…ので、そのメモ書き。
http://q4m.31tools.com/

MySQL5.1をインストールする
5.1系はまだdevelにしかないので、5.0系をインストールしている場合はdeactivateする。 データベースの初期化とかパスワードの設定とか自動起動とかの諸々は割愛。

$ sudo port deactivate mysql5 $ sudo port install mysql5-devel +server

Q4Mをダウンロードしてビルドしてみる。

$ cd /ur/local/src $ wget http://q4m.31tools.com/dist/q4m-0.8.3.tar.gz $ tar -zxf q4m-0.8.3.tar.gz $ cd q4m-0.8.3 $ ./configure --prefix=/opt/local/lib/mysql5/mysql --includedir=/opt/local/include ... checking for mysql source code... configure: error: "no mysql source provided"

MySQL本体のソースが必要みたいなので用意する。
MacPortsのソースはビルド完了後に削除されてしまうので、別途ダウンロードして展開しておく。

$ cd /usr/local/src $ wget http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.30.tar.gz/from/http://ftp.iij.ad.jp/pub/db/mysql/ $ tar -zxf mysql-5.1.30.tar.gz

再挑戦。

$ cd /usr/local/src/q4m-0.8.3 $ ./configure --prefix=/opt/local/lib/mysql5/mysql \ --with-mysql=/usr/local/src/mysql-5.1.30 \ --includedir=/opt/local/include ... checking for mysql source code... "/usr/local/src/mysql-5.1.30" failed to lacate mysql 5.1 installation Please specify mysql 5.1 directory with --prefix option.

ライブラリヘッダのパスが解決できないみたいので、prefixを変更してインストール後に調整することに。 それだけだと微妙に通らないのでシンボリックリンクも使ってちょっと強引に回避する。

$ cd /opt/local/include $ sudo ln -s mysql5/mysql mysql $ $ cd /usr/local/src/q4m-0.8.3 $ ./configure --prefix=/opt/local \ --with-mysql=/usr/local/src/mysql-5.1.30 \ --includedir=/opt/local/include

configureは通ったのでmake。こける。
boostが必要とかヘッダフィルが読み込めないとかライブラリがどうとかいろいろ怒られるので頑張る。 CPPFLAGSとかには mysql_config -libs の出力結果を参考に指定するといいらしい。

/opt/local/lib/mysql5/bin/mysql_config -libs
boostをインストールしてビルド。--with-syncも追加した。
$ sudo port install boost $ $ CPPFLAGS="-I/opt/local/include/mysql5/mysql -I/usr/local/src/mysql-5.1.30/sql -I/opt/local/include" \ LDFLAGS="-L/opt/local/lib -L/opt/local/lib/mysql5/mysql -lmysqlclient -L/opt/local/lib -lz -lm -L/opt/local/lib/ -lssl -lcrypto" \ ./configure --prefix=/opt/local \ --with-mysql=/usr/local/src/mysql-5.1.30 \ --with-sync=fsync $ $ make

正常にビルド完了したら、MySQLにプラグインをインストールする。
prefixを変更していたのでちょこっと調整してからインストールスクリプトを実行。

$ sudo make install $ $ cd /opt/local/lib/mysql5/mysql/plugin $ sudo ln -s /opt/local/lib/libqueue_engine.so libqueue_engine.so $ sudo ln -s /opt/local/lib/libqueue_engine.la libqueue_engine.la $ sudo ln -s /opt/local/lib/libqueue_engine.a libqueue_engine.a $ $ cd /usr/local/src/q4m-0.8.3 $ mysql5 -u root -p mysql < support-files/install.sql

動作確認してみる。

$ mysql5 -u root -p mysql mysql> SHOW ENGINE QUEUE STATUS;
おしまい。

2008. 10. 21

drawrのイラストをあとで見るようにクリップするGreasemonkey書いた
こんなの。

drawrの新着を辿りながらげしげしタブを開いていたら、タブの数が大変なことになったよ!という人向け。

とりあえず何も考えずに気になったイラストをどんどん放り込んで、あとでまとめて見るような使い方してます。 調子に乗って新着辿ってたら300件以上溜まってしまったので、それはそれで困った。。。
拡張マイリスト (0.9.2)
Pager部分のスタイルが変更になっていて表示が崩れていたので修正。
SeaHorse版も併せて更新。 最近はあまりニコニコしていない。
雑記
更新する習慣をつけたい。特に何があるという訳でもないけど。
周りで新しいMacBook買った人が続々なのでインストールしたものでもまとめてみるかなあ。

  [ 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 ]