仕事と晩飯とその他

日記です。

一進一退

openbdのjson、coverageの全件読み込みに続いて、getで1000件ずつONIXの読み込み。千件までは問題なし。では、和書全件(83万件)行くかと思ったらタイムアウトに次ぐタイムアウト。もうなにやってもダメ。file_get_contentsじゃだめかとcurlも試すがやはりだめ。すっかりやる気も無くなり諦めかけたが、読み込むフィールドを絞り込んだらどうかと再挑戦。やはりだめ。再び諦めそうになるも、set_time_limitでどうにかならないかとすがってみる。なんと、読み込む量が増えたではないか。ということは時間伸ばせばいけるのか。根本的な解決ではないのはわかったうえでset_ti

me_limitをさらに増やしてみた。

読み込むじゃん。

ということで、ようやく、ISBN、タイトル、著者、発売日、出版社(ここまでsummaryから)、価格、内容紹介(短)、内容紹介(長)を一気にREPLACEできるようになった。よかった。しかし、これでタイムアウトということは、これ以上重い処理はどうなのか。不安。

ここで一旦PHPを書くのはやめて、テーブル設計を再考。単に検索や表示だけでなく、データのインポートまで含めて考える必要があるようだ。

一度に作成するのは諦めて、「ISBNと日付をDBにインポート」→「クエリーで近刊のみを抽出→千件ずつopenbdのJSONを読み込む」やり方に方向転換。cronで動かそう。

近刊のみの抽出のSQLではまる。なんで? いや、近刊のみの抽出はできてる。問題は、千件ずつの切り分け。ああ、そうか、変数名を変えないとダメだ。あれだ、XMLでネストした時にハマった奴だ。

なんとか完成。

手順1.coverageで取得したISBNを千件ずつ切り分けてgetでjsonから抽出したpubdateと合わせてDBにインポート(約6分)

手順2.クエリーで近刊のみを抽出して千件ずつに分けgetでjsonから抽出した価格や内容紹介(長・短)と合わせて別のテーブルにインポート(約3秒)

件数少ないと速いなあ。そして、83万件全件だとフィールド数が多くても少なくてもそれほど時間は変わらなかった。全件インポートを高速化するには並列処理とかって話になりそう。だからpythonなのか。あと、GOとか。PHPでもできるんだろうか、並列処理。

ここまでで「openbdの全件データをインポート可能な状態」になった。何度でもやり直せる。来週の三連休でもっと進めたい。