コンピュータ環境 (2009/05)

最初の書き込みへ

基本の環境はこちら

2009年04月の環境
2009年06月の環境
戻る


時系列・環境の変遷


 

2009/05/31 (Sunday)
300万レコードの すごい クエリー

 300万レコードばかりのテーブルから選択クエリーを演算つきで発行してみました。

 目的はできたクエリーをエキスポーとして EXCEL でみることだったんですが、なんとできたクエリーのメニューは、エキスポートが半透明になっていて選択できない状態です。

 いじっていたらメッセージを表示「メモリが足りません」あのね、4GB積んでるんですけど。

 一晩放置してみつけた解決策は、このクエリーと同じ構造のテーブルを準備して、選択クエリーから追加クエリーに設計を変更、全レコードをこの一時テーブルに追加するというものでした。
 できあがったテーブルは無事エキスポート出来ました。

 このテーブルを入れてあるデータベースは、サイズ的には100MB位しかありません。それでも300万レコード読み込んで選択クエリー発行するとメモリ不足ですかそうですか。これ、あと10倍強までレコード数増える予定なんですが。毎月1回データ収集しましてですね。

 どうなるのか、1年先が楽しみでございますですね♪

2009/05/29 (Friday)
ACCESS の すごい 亡霊レコード

 約30万レコードのテーブルから読み込んだデータを MeCab で処理し、何のかんのといいながら300万レコードばかり出力するスクリプトは正常に作動するのですが、「何なんだこれは」と思わず叫ぶ事態に遭遇してしまいました。

 その入力レコードを完全に別のソースから収集して300万レコードの再作成を試したのです。

 ソースを参照するテーブルを削除、ソースを入力するテーブルを削除、出力レコードを格納するテーブルを削除、んで、ソースを参照するテーブルのレコードを再作成、そのレコードを参照しながら30万レコードを再作成、そのレコードを参照しながら300万レコードを再作成。

 さて出来上がったレコードを参照してぶっ飛びました。

 再作成する「前の」レコードを参照して出来ていた「古い」300万レコードが再作成されていたのですアリエネー。中間のテープルも最初の入力テーブルも間違いなく新しく作ったレコードなんですよもう信じられない。

 一体何が原因でこんな削除したはずのレコードが復活してきたのでしょうか。

 ともかくももう一度最後の300万件を削除しました。

 このまま再実行したら、多分同じ結果になるだろうという想像はつきました。何とか事態を打破するにはどうしたらいいのか。

 考えましたよ、考えました、マジに。
 で、何をしたかというと、compactdatabase。

 実行結果は正常でした。

 以上、報告まで。

2009/05/31へ

2009/05/25 (Monday)
Perl の すごい スクリプト

 というわけで、前回の作業で忌避用語が1500余り収集できました。ここで天啓。これまで MeCab で分解した単語は無条件に蓄積テーブルに出力していましたが、出力の直前にこの忌避テーブルに存在しない単語だけ蓄積テーブルに出力すればどうだろうということです。

 相当な量の不要な単語が蓄積対象にならなくなり、蓄積テーブルはダイエットできるわけです、理論的には。現在680サイト巡回して最終的な蓄積テーブルが1.1GBですから、目標とする1700サイトだと軽く2GBを突破して、MS-ACCESS の扱える量を越えてしまいます。
 これまでは、しょんなかたい、MySQL でもインストールするかねと思っていたのですがこれでもう大丈夫、2GB以内におさめられる可能性が限りなく高くなりました。

 というわけでいさんでスクリプトの改造に取りかかりましたが思ってみない SQL 文を発行する段階での実行時エラーを引き起こしてしまいます。もう信じられない、問題の SQL をコピペして ACCESS の IDE からクエリー作成画面に進み、直接 SQL 文をはりつけると正常実行するのですよ。

 たった1行ですよ、「SELECT x_str_text FROM excepion ORDER BY x_lng_index;」とこの SQL 文のどこがいけないというのですか !? (気が付いた人は挙手)。そうです、予約語でした。[execption] にしないと動きません。テープルの名前を excep に変更しました……

 続いて現在嵌まっているのが、そうして取り出したフィールドをハッシュ配列に追加するというただそれだけのことが…できない(涙)、どうしてもできない。push を使う必要があるらしいことは分かりましたが、いろいろと書き方を変えて試していますがうまくいきません。まさか1行ごとに SQL 発行するわけにはいきません、1日たったって終るわけがない。何としてもハッシュに読み込んで exist で検査しなければならないのです。

 後1日半。果して間に合うでしょうか、結果をお楽しみに。

2009/05/29へ

2009/05/19 (Tuesday)
続・MeCab の すごい インストール

 結局 Perl から ACCESS を直接操作することにして、MeCab の Perl 用モジュールを捜したのですが、手持の環境 Perl 5.10 に対応しているモジュールがないんです。(涙)自分で構築するような知識はないので、いったん Perl のバージョンを 5.8 に落すことにしました。

 5.10 の環境はそのままにして、.5.8 をインストールし、環境変数の Path の値を 5.8 のモジュールに変更して、さあこれで MeCab のインストールができる、とダウンロードサイトに行きました。
 ダウンロードしようとすると、エラー・メッセージ。「ビルド800番がみつかりません」…

 ダウンロードサイトに問合わせフォームが合ったので聞いてみました。午後5時半。回答はあっても明日だなと食事して寝際に睡眠薬でふらふらの状態でパソコンを閉めようとしたら返事が来ているではありませんか。びっくりしました。原因はおそらく 5.10 を削除していないため。5.8 も削除してシステムを再起動し、改めて 5.8 のインストールからやり直してみてくれと。
 おろおろとろれつの回らない手でお礼の返事を書き、昨夜はそのまま寝ました。

 明けて今朝、一番にアドミニストレータでログインし、5.10 の環境を削除、5.8 も削除してシステムを再起動、5.8 を改めてインストールしなおしました。それから、MeCab の辞書をまずインストール。後の処理がめんどうになるので、データに合せて Shift-JIS の辞書を選択。
 今度は無事にインストールできました。続いて MeCab の pm モジュールもインストール成功。

 サンプル・プログラムを実行させて正常作動を確認しました。ヨカッタ。

 というところでユーザでログインしなおして、ブラウザやらメーラやら復讐日記やらジュークボックスやらいつものものを立上げてみましたところ、またしてもダウンロードサイトから返事が来ていました。タイムスタンプは午前0時半。
 改めて、うまくいきましたとお礼の返事を流して、データ処理のプログラム作成開始です。

 ACCESS データベースのレコードを1レコード、SQL で読みだして、MeCab で分解し、1要素ごとに別のテープルに INSERT INTO SQL で追加していきます。キーは入力レコードのキーに加えて、1要素出力するごとに1ずつ増分するフィールとを加えてユニークにします。

 このところ Perl ばかり書いているので割とさくさく進んでいよいよ本番だと、29000レコードばっかり喰わせてみましたところ、途中でいきなり異常終了。
 ううむ…これは何なんだ一体、と1レコード処理するごとに1秒処理を止めてみました。あんま意味ないだろうなと思いつつちょっと外出して、もどってみればやはり異常終了しています。

 ACCESS の INSERT INTO SQL に問題がないことは、入力して処理したデータを画面表示させるだけにしてみてもやはり異状終了するので確認できました。すると… MeCab モジュールに何か問題があるとでも?

 少しずつやってみることにしてプログラムを改造。前回入力を終了した次のレコードから処理を始めるよう、入力用 SELECT SQL に手を入れて実行させてみました。
 やはり、異状終了します。

 この期に及んでやっと、異状終了しているのが「同じ入力レコードの位置」だということに気付きました。
 データかよ。
 完全に読みちがえていました。どうせテストデータです。レコードごと削除。
 問題のある大分類レコードの出力結果をまるごと削除して、そのサイトのデータを再度処理しますとまた異常終了。で、またレコード削除。これを3回ばかりくり返しまして無事通過。結局データの何が問題だったのかは分からずじまいで(^-^)\バキッ☆

 ともかくも無事終了、出来上った25万レコードばかりのテーブルにクエリーを発行して、分解した要素ごとにグループ化し、その同じフィールドの値のレコード数をカウントさせてみました。
 案の定というか、>とか<とか HTML に特有の単語や、Javascript、CSS などの用語が頻出しています。

 新しいテーブルを作成して忌避用語を端から登録、1000件ばかりコピペしてまだまだおわらないのですがこの辺でいいかと判定。

 明日のデモは諸般の理由から金曜日に延期されました。それまで何をしていようかなと考え中です。もう少し大規模なデータで再度やってみるのもいいかもと思っています。

2009/05/25へ

2009/05/17 (Sunday)
MeCab の すごい インストール

 成功報酬の作業は収集したデータを MeCab で処理する段階に進みました。

 そこで、まず MeCab のインストール。これ自体は簡単で問題もなく、確かに動作も確認したのですが。

 問題は標準入出力にデータをどう喰わせるか…ACCESS データベースの1レコードを1ファイルとして喰わせて一時ファイルに出力させ、これを読み込んで処理して次のレコードから新しく1ファイル作るのかなぁ((汗))

 やってられないということで Perl から呼び出すモジュールを捜し出しましたが、これがバージョン 5.8 にしか対応しておらず、宅の環境 5.10 では使えないときた。さらに、おそらくは自書ファイルが EUC で記述されていて一方 ACESS のデータは Shift-Jis もう頭痛い。

 なんだか書方まで投げやりになってます。実際困ってます。どうなるでしょうか…

2009/05/19へ

2009/05/15 (Friday)
www アクセスプログラムの すごい デモ

 という一苦労して作成したプロトタイプですが、事務所のパソコンに環境を移植してデモしたら動かないのですよ。

 何ということでしょう。

 出た、何ということでしょう、キタ━━━━(゚∀゚)━━━━!!ー

 もうどこが悪いのか皆目見当がつかず、アンテナプログラムを穴の開くほど見つめて設定を確認しますが全部正常。
 でも、実行させると戻り値は何と 408 という見たこともないコード…ああ、Request Time Out でしたか。なんでだ、なんで正常応答しない…

 救世主はもう一人、同席していた SE 氏でした。

 「ちょっと、いいですか…」と声をかけてくると、やにわに画面右下のアイコンをいじって、**のウイルス駆除プログラムのコントロール・パネルを開きました。さすがに自分もこの時点で天啓。
 「ファイアウォールか!」「だと、思うんですよね」と、現在状態のインターネット接続を「条件接続」から「完全開放」にした瞬間、のろーりのろーりと 408 を返していた DOS 窓の表示がきびきびと 200 を返すようになりました。ピンポイントです。

 その後、ふたりでいろいろと設定をいじってみたのですが、どうしたらこのアンテナをファイア・ウォールのホワイト・リストに載せるのか、その方法はついに分かりませんでした。

 そのとき、自分は嘆いたものです。「ああ、このマシンに MacAfee のアンチウィルスがインストールされていれば」と(笑)。

 そんなこんなで無事デモも終り、ファイア・ウォールの接続を「条件接続」にもどして一件落着。このまま本格稼働はせず、さらにこうして収集したデータの加工方法についての指示を受けました。

 もうしばらくテストサイトのデータでプロトタイプ開発を続けるようですが、ここで ACCESS VBA でやってしまっていいのか、それとも将来の手戻りを念頭に、Perl でやるべきか、今マジ悩んでいます。

 データの加工自体はユーザー i/o がほとんどありませんからどちらでもいいのです。問題は加工のすんだ、統計の取れた状態になった時の i/o です。一体どうしたらいいのだろうか…

2009/05/17へ

2009/05/14 (Thursday)
続・Perl の すごい wwwアクセスプログラム

 というわけで完成したプログラムでしたが、サイトによって漢字コードが化けていることを発見しました。

 調べると、charset=UTF8、charset=EUCのサイトが文字化けしています。おもしろいと思ったのは、そういうサイトは絶対数が少なく、ほとんどのサイトが charset=shiftjis だったことでした。\(・_\)ソノハナシハ (/_・)/コッチニオイトイテこの文字化けなんとかしなければいけません。夕方からデモだというのに「まあほとんどのサイトでは問題ありませんよあっはっはー」と最後は開き直ることを念頭に原因追及。

 Perl の文字コードに関する記述を www であちこち漁りながら無為に過ぎて逝く時間。成果は出ません。しまいにいじりすぎて、ちゃんと動いていたソースがコンパイルすらできなくなってしまいました。しかも!バックアップを取っていなかったという罠。

 コンパイルエラーの発生する70行目あたりは手を入れていないというのにこれは一体どういうことなんだといろいろと調べたら4行目の宣言文が原因で、これを削除したらコンパイルが通ってしまったという、もう Perl なんてきらいだみたいなエラーでしたが。ともかくも原状復帰には成功しました。

 その頃には漢字コードの判別方法に Guess というメソッドがあることをみつけており、このメソッドの返す戻り値の中にある ->Name という変数に文字コード名がはいっていることを発見、こうして、if 文で分岐させ、shiftjis でなかったら、c932 にコード変換せろという記述を入れて無事解決することができました。

 そうやってつくったデータは、本文のメタタグにある charset の値と実際に記述されている文字コードが不一致の状態にあるわけですが、この差違はブラウザが吸収してくれますし、そもそも元の画面を再現することが目的ではないので(実際画像ファイルをはじめ、CSS や Javascript など外部ファイルを参照しているとこれは持ってきませんから表示ガタガタになっています)、問題なしということで。

 ただ、変換したコードが shiftjis なので、将来 MySQL にデータを収用する段になったらひと悶着あることは必定、升気が重いです。

 とはいえ、デモしてどうよと話を聞いたら、データが取れるのは分かった、で、その先の加工方法だがということで話が進んでしまい、容量の問題はとりあえず棚上げでもう少しプロトタイプのまま開発を進めることになってしまいました。
 正直ここから先、ACCESS の VBA でごりごりとコードを書いていくと将来 MySQL に乗換えた時の手戻りが半端ねー状態になるので今から汎用的な方法で処理しておいたほうがいいかもと思っています。

 一応、ACCESS データベースを Perl から扱えるようにはなりましたので、Perl で書いておいたほうがいいかな、と。

2009/05/15へ

2009/05/11 (Monday)
Perl の すごい wwwアクセスプログラム

 新しい仕事の第1弾ということで、登録したurlを巡回して、更新しているページがあれば丸ごと引き抜いてデータベースに格納するというプログラムを作成しています。

 先月の末に作成したプロトタイプは、使用していた Perl の教科書が10年前のものが災いしておそらくIPマスカレードに対応しておらず、せっかく指定した URL にアクセスしても 400 とか 403 とかを返すというていたらくでした。

 そこで勉強しなおして、LWP というモジュールを使うといいということがわかり、www でサンプルを取ってきて書いてみたところもう一発でデータの引き抜きはできるようになりました。
 問題は引き抜いたデータを MS-ACCESS に格納する部分。

 Perl から ACCESS を操作するのもサンプルを見つけて割と簡単にできたのですが、データの出力は問題なくできるとはいえ、RecordCount は使えないとか、MoveLast するとポインタの移動先は最後のレコードではなくその次の EOF だったりというように微妙に違うのでとまどったり、何より AddNew とか、Update が使えないのが遺体。

 データの入力には INSERT INTO の SQL しかないかと最初は取ってきたデータを丸ごと SQL にして投げてみるのですが、エラーも出さずデータも追加されないという現象。
 調べてみたら取ってきたデータが 14K あったりして、ああこれは SQL の文字制限をはるかに突破しているではないか…たしか 256 文字までだったよねということで一旦ここでくじけたのですが。
 升ファイルに出力してみようかねとテンポラリ・テキストファイルに出力してエディタで眺めていたら、「これ、1行ずつ格納したらいいじゃん」という天啓が。
 さっそく、そのテンポラリ・ファイルを1行ずつ読み込みながら INSERT INTO 文を発行するようロジックを変更、データベースも正規化して対応、今度はうまくいって無事データを格納することができました。
 しかし…14K のデータというと一回で1400行くらい作るんですね、このデータ量の限界が気になっている今日このごろです。

 今、2009/05/14へ

2009/05/07 (Thursday)
メーラーの すごい 再インストール

 どうしてもメール・ボックスの位置 (c:\Documents and Settings\ユーザー\applications\thunderbird\mail ... だっけね) が気に入らず、好みの場所に移動させたところ起動しなくなってしまいました。しかたない、再インストールだと一旦プログラムを削除、残っていたディレクトリも全部削除して再インストールです。

 一応元データをもどして省略時の位置で使っていますが、どうしても気に入らないのでなんとか別の場所に置ける方法を捜すつもりです。

 あと、古いデータで、サブ・ディレクトリに入れてあるものの変換方法を開発しました。

  1. サブ・ディレクトリ内のデータ・ファイルを年号付きにして (2002_etc みたいに)、これを一段上のメール・ディレクトリに移動させる
  2. サブ・ディレクトリを削除する
  3. メーラーを開くと、全部の過去データが年号付で表示されるので、どれかをポイントする
  4. ファイル〜サブ・ディレクトリを選択、場所をルートにして年号のサブ・ディレクトリを新規作成する
  5. その年号のファイルを全部新しく作ったサブ・ディレクトリに移動する
  6. 移動後、ファイルの名前を変更して年号を取り去る(これは必要無いかも)

 こんなんで一応全部読めるようにしました。データは年末まで一応ハード・ディスクに保存して、来年になったらサブ・ディレクトリはバックアップ後削除する予定ですが予定は未定決定にあらず(^-^)\バキッ☆

2009/05/11へ

2009/05/06 (Wednesday)
メーラーの すごい アップデート

 通販の便宜を図るために、メーラーの受信データをプログラムで直接読み込んで処理していた関係で、Netscape 4.7 [ja] というメーラーを今に至るまで使いつづけていました。まあ、メーラーなんてどこのものも似たりよったり、だったらマイナーな方が攻撃対象にもなりにくいだろうくらいの前向き思考で使用していましたが、このほどめでたく通販事業が清算されました関係で、もうこのメーラーにこだわる必要がなくなりました。

 それで、もう一歩のところで AL-Mail をインストールするふんぎりがつかず、友人に使っているメーラーは何?と聞いたら「サンダーバード、Moziraのなれの果て」と言われてそれだ、Netscape の正式な後継者じゃないかとあっさり決定、先程インストールしてみました。

 設定もアドレス帳もメールボックスもさくさくインポートしてくれまして使い勝手もほとんど変らず、何より一挙手一投足が早いというおまけまでついてきてそこそこ満足しています。

 問題は、メールボックスのうち、サブ・ディレクトリに入れたのはインポートしてくれないこと。去年より古いデータは Netscape を削除せずにおいてそれで読むしかないようです。まあ、過去ログひっくり返すことなど郷愁に駆られない限りまずありませんから問題ないといえばいえます。

 そんなこんなで最新のバージョンになったメーラーはとても快調です。

2009/05/07へ

最初に戻る
戻る