質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • MySQL

    5859questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JSONファイルのインポート

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,115

gyojin

score 76

初歩的な質問で申し訳ありませんが

170MBほどのJSONファイルをMySQLに落とし込もうと
PHPで簡単なスクリプトを作ったのですが
まる一日以上たってもまだ完了しません。

手を付けてしまったのはどうしようもないのですが
json形式のデータをDBに手早くインポートする方法は無いものでしょうか?

追記、MySQLに限らず、jsonの取り扱いに比較的やりやすいDB等ありましたら知りたいです

再度追記
jsonのカラムは2つだけ、いずれもvarchar(255)にしてあります。
phpを載せておきます

<?php
ini_set("max_execution_time",0);
$jsonArray=json_decode(file_get_contents("./largeData.json"));

try{
        $PDO=new PDO("mysql:host=192.168.1.7;dbname=jsonTest","dbUser","password");
}
catch(PDOException $e){
        print "PDO connect error".$e->getMessage();
        exit();
}
$string="DELETE FROM t000_jsonTable";
$stmt=$PDO->query($string);
//print "<pre>";
//print_r($jsonArray);
//print "</pre>";
$i=0;
$string="INSERT INTO t000_jsonTable (name,suuji) VALUES( :key , :value )";
$stmt=$PDO->prepare($string);
foreach($jsonArray AS $key => $value){
        $i++;
        $stmt->bindValue(":key",$key);
        $stmt->bindValue(":value",$value);
        $stmt->execute();
        if(!$stmt){
                print "insert失敗<br>\r\n";
                print $string;
                break;
        }
        print "insert完了".$key.":".$value."<br>\r\n";
}
?>


jsonファイルの頭部分も載せておきます

{"\u674e\u6210\u6d69": 13.881965678750785, "\u30d6\u30b9\u30c6\u30fc\u30ed\u30fb\u30c7\u30fb\u30d5\u30a3\u30b9\u30c6\u30a6\u30b9": 14.57511285931073, "170698": 14.57511285931073, "NLWW": 14.57511285931073, "\u3083\u304f\u3089\u304f\u3054\u3089\u3044\u3076": 14.57511285931073, "\u30af\u30ec\u30a2\u30a6\u30a7\u30eb\u30e9\u30f3\u30c8": 14.57511285931073, "Yelorna": 14.57511285931073, 
以下延々と続く
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

サイズ的にそれほど大きなデータでもないですが
prepare処理でカラムはblob系の大きめな領域をとっていますか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/21 20:32

    カラムは2つあり、いずれもvarchar(255)です。

    キャンセル

  • 2017/02/21 20:39

    varchar(255)には255文字までしか入らないと思いますが

    キャンセル

  • 2017/02/21 20:48

    jsonファイルとphpを載せたので見ていただきたいのですが
    文字列と数字が組みになっていまして
    それぞれをvarchar(255)のカラムに入れています。
    PHPはだいぶダメダメですが、正直ここまで時間がかかるとは思っていませんでした。

    キャンセル

  • 2017/02/21 22:20

    なるほどキーと値を1レコードとして登録しているのですね
    キーはvarcharだとして、値はdoubleじゃなくてよいのでしょうか?

    また170Mのデータを一度配列に展開してるのでしょうか?
    SQLに流し込むのではなく配列としてforeachで回す箇所に
    高負荷がかかっていないか空で回して時間を図ってみてください

    それとINSERT文を1レコードずつ流し込んでいるように見えますが
    これはそうとう効率が悪いです。
    1,000単位くらいでバルクインサートになるように工夫をするとよいでしょう。

    キャンセル

  • 2017/02/21 22:56

    そもそも練習用なのでdoubleにはこだわっていなかったです。とりあえずやってみよう的な感じです。
    他にも一旦PHPでjson→CSVに変換させて、CSVをまとめてインポートさせようかとも思ったのですが
    メモリ不足で止まってしまいました。サーバーがショボいせいもあると思います。
    バルクインサートは知りませんでした。MySQLに関してはこれが一番いい回答なのかな?

    キャンセル

0

webサーバに置いたこのphpを、ブラウザから実行していらっしゃいますか?

もしそうなら、insertが終了しないという問題ではなくて

サーバのタイムアウト等で中断されてしまっているか、
ブラウザが応答待ちタイムアウトしてしまっているだけ、ということはないでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/22 13:29

    コマンドラインからの実行です

    キャンセル

  • 2017/02/22 14:15

    失礼しました。

    insertの処理速度に関しては、他の方のご回答にある通り
    1000行一括のバルクインサートで(経験上)10倍以上速くなります。
    また、json_decode()にもそれなりに時間がかかってると思います。

    追記のご質問にあったjsonに特化したDBというのは(ご存知かもしれませんが)
    MongoDB というのがあり、「json形式のデータをDBに手早くインポート」できるようです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • MySQL

    5859questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。