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

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

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

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

Q&A

解決済

2回答

4476閲覧

JSONファイルのインポート

gyojin

総合スコア94

MySQL

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

0グッド

0クリップ

投稿2017/02/21 10:37

編集2017/02/21 11:45

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

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

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

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

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

php

1<?php 2ini_set("max_execution_time",0); 3$jsonArray=json_decode(file_get_contents("./largeData.json")); 4 5try{ 6 $PDO=new PDO("mysql:host=192.168.1.7;dbname=jsonTest","dbUser","password"); 7} 8catch(PDOException $e){ 9 print "PDO connect error".$e->getMessage(); 10 exit(); 11} 12$string="DELETE FROM t000_jsonTable"; 13$stmt=$PDO->query($string); 14//print "<pre>"; 15//print_r($jsonArray); 16//print "</pre>"; 17$i=0; 18$string="INSERT INTO t000_jsonTable (name,suuji) VALUES( :key , :value )"; 19$stmt=$PDO->prepare($string); 20foreach($jsonArray AS $key => $value){ 21 $i++; 22 $stmt->bindValue(":key",$key); 23 $stmt->bindValue(":value",$value); 24 $stmt->execute(); 25 if(!$stmt){ 26 print "insert失敗<br>\r\n"; 27 print $string; 28 break; 29 } 30 print "insert完了".$key.":".$value."<br>\r\n"; 31} 32?>

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

json

1{"\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, 2以下延々と続く

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

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

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

投稿2017/02/22 04:28

taka-saan

総合スコア665

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gyojin

2017/02/22 04:29

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

2017/02/22 05:15

失礼しました。 insertの処理速度に関しては、他の方のご回答にある通り 1000行一括のバルクインサートで(経験上)10倍以上速くなります。 また、json_decode()にもそれなりに時間がかかってると思います。 追記のご質問にあったjsonに特化したDBというのは(ご存知かもしれませんが) MongoDB というのがあり、「json形式のデータをDBに手早くインポート」できるようです。
guest

0

ベストアンサー

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

投稿2017/02/21 11:26

yambejp

総合スコア114572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gyojin

2017/02/21 11:32

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

2017/02/21 11:39

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

2017/02/21 11:48

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

2017/02/21 13:20

なるほどキーと値を1レコードとして登録しているのですね キーはvarcharだとして、値はdoubleじゃなくてよいのでしょうか? また170Mのデータを一度配列に展開してるのでしょうか? SQLに流し込むのではなく配列としてforeachで回す箇所に 高負荷がかかっていないか空で回して時間を図ってみてください それとINSERT文を1レコードずつ流し込んでいるように見えますが これはそうとう効率が悪いです。 1,000単位くらいでバルクインサートになるように工夫をするとよいでしょう。
gyojin

2017/02/21 13:56

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問