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

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

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

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

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

6028閲覧

phpで大量データを扱う際のphp.iniの設定値について

mizutama72

総合スコア31

MySQL

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

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2018/07/21 03:00

編集2018/07/22 02:14

phpを使用したWEBシステムを開発しています。
サーバはubuntuです。laravelを使用しています。

現在74万件のデータを扱う必要があり、テストをしていますが、途中で終了してしまいます。
処理毎にログをはかせていましたが、時間がかかる処理のところで、ログは終わっていて、エラー等も出力されません。
apacheのエラーなども見てみましたが、エラーは特に出ていません。

php.iniの設定値を以下のようにしてみましたが、状況は変わりませんでした。

post_max_size = 1024M upload_max_filesize = 1024M memory_limit = -1 max_execution_time = 1800

情報が不足していましたので、補足致します。
サーバ管理者がやめてしまったので、調べつつ設定しています。的外れなことを書いてましたら、ご指摘ください。

参照したログは、laravelが出力するエラーログ /システムパス/storage/logs/laravel.log
サーバの/var/log/apache2/error.log です。

php.iniの設定値は、ネットで調べて元々の値を増やした形です。
memory_limit = -1 -> メモリ無制限
post_max_size = 1024M -> 元々が8MBなので、1024MBまであげてみて様子を見るという素人判断です。
upload_max_filesize = 1024M -> 元々が2MBなので、1024MBまであげてみて様子を見るという素人判断です。

システム実行中に、
vmstat -SM 10 で使用状況を見てみましたが、free が1696Mあったので、そこまでメモリを使い切っていないような気もするのですが、そもそもこの部分は関係ないのでしょうか?

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 2 0 462 1696 69 443 0 0 0 0 621 79 25 0 75 0 0 1 0 462 1696 69 443 0 0 0 2 586 77 25 0 75 0 0

今回は、DBに保存できないデータのため、配列に全てのデータを格納しています。
foreachを繰り返し使用して配列の内容を参照して計算などを行なっています。

2018/07/22 追記
以下のプログラムで落ちてしまうようです。

php

1//$score_labels_arrayは6個 2for ($i = 0; $i < count($score_labels_array); $i++) { 3 $count=0; 4 //↓$dataが元データを分散されいるものの最大で40万件と多いため、この部分がネックのようです。 5 foreach ($label as $data) { 6 $label_arrays = explode("〜",$score_labels_array[$i]); 7 if($i == count($score_labels_array)-1) { 8 if ($label_arrays[0] <= $data && max($label) >= $data){ 9 $count++; 10 } 11 } else { 12 if ($label_arrays[0] <= $data && $label_arrays[1] > $data){ 13 $count++; 14 } 15 } 16  } 17  $keisan_data[$key]['line'][$label_key][$score_labels_array[$i]] = $count; 18 }

上記で何をやっているかというと、あるデータの数値が数値ラベルの範囲にあるかどうかを判定して個数を調べています。判定するには、1つ1つのデータで判定しなければならず、この部分にメモリを使用しているようです。
ubuntuサーバではなくて、私のmacの環境でメモリを調べましたが、

PhysMem: 4066M used (1361M wired), 28M unused.

と表示されていて、メモリギリギリ使用しているような状況です。

そこで、質問なのですが、こういった大量データを1件ずつ調べなければいけない時のプログラムは、foreachでぐるぐるやってしまうと危険なのでしょうか?
自己流プログラミングでお恥ずかしいのですが。。。同じようなことをやってらっしゃった方がいましたら、と思い追記しました。

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

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

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

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

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

guest

回答2

0

ベストアンサー

んとね、それ、だいたい同じ時間で終了してるでしょ?
これだね。

max_execution_time = 1800

これだと、3分以上処理に時間がかかる場合、強制終了される。

http://php.net/manual/ja/info.configuration.php#ini.max-execution-time

投稿2018/07/21 05:18

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/07/21 05:21

はっ! 30分だった…
退会済みユーザー

退会済みユーザー

2018/07/21 05:21

よっぱらってるから仕方ない仕方ない。
退会済みユーザー

退会済みユーザー

2018/07/21 05:22

なので、やっつけ仕事的には、 max_execution_time = 0 これで、時間制限ナシ。
mizutama72

2018/07/21 05:24

ありがとうございます! 試しに、max_execution_time = 0 でやってみます。
退会済みユーザー

退会済みユーザー

2018/07/21 05:24

でも、そういうことはしないで処理を小分けにしてAjaxで適宜叩くのが理想。 そうすると、プログレスバーなんかも実装できて、みんなが幸せ。
退会済みユーザー

退会済みユーザー

2018/07/21 05:26

apache(等のWEBサーバ)の再起動必要だからねー。
mizutama72

2018/07/21 05:28

ご丁寧にありがとうございます! 処理を分ける方法も考えてみます。
退会済みユーザー

退会済みユーザー

2018/07/21 05:31

さらに余談だけど、小分けにしないで別プロセス立ち上げて実行、ブラウザからAjaxでその結果をモニタリング、が、一番理想。 ま、とりあえず、max_execution_time = 0 で解決するか確認するのが先決で、 それでなかったら別の問題の切り分けしなきゃいけないから、あれこれ話してもムダだし。
mizutama72

2018/07/21 06:06

max_execution_time = 0を設定、apache 再起動後に実行してみましたが、状況変わらずでした。 現在は、php側で一気に色々な計算をしてから、view側に渡していますが、 やはり処理を分けないと動かないのかもしれません。 別プロセス立ち上げて実行というのは、execなどを使用するのでしょうか?
退会済みユーザー

退会済みユーザー

2018/07/21 06:14 編集

あんまり嬉しい結果じゃなかったね。別の問題ってことか。 >別プロセス立ち上げて実行というのは、execなどを使用するのでしょうか? そう、exec()とかsystem()コマンドで、CLIとしてphpファイルを実行するの。 ubuntu みたいなLinux系の場合はバックグラウンド実行のオプションが & だったと思うので exec("php /path/to/php/file.php &"); でよかったような…。 ただし、max_execution_time = 0でダメなら、別の問題っぽいから まず、原因が何なのか調べないとダメだろうな。
mizutama72

2018/07/21 06:19

色々と教えて頂きありがとうございます。非常に参考になります! プログラム側で原因が何なのかをログなどを出力して、少しずつ調べてみます。
退会済みユーザー

退会済みユーザー

2018/07/21 06:22

現在のメモリ使用量をあわせてエラーログを出すと良いね。 サーバ管理者が辞めて大変だろうけど、のんびりがんばって。
mizutama72

2018/07/22 01:59

時間がかかっている箇所がわかりました。 追記します。
退会済みユーザー

退会済みユーザー

2018/07/22 10:46

>foreachでぐるぐるやってしまうと危険なのでしょうか? 適切にunset()でメモリを解放しない限り、スコープを抜けるまではメモリを消費し続けるのでメモリを食いつぶしてしまいますね。
退会済みユーザー

退会済みユーザー

2018/07/22 10:49

PhysMem: 4066M used 4GB程メモリをつかっているみたいですね。ubuntuの方で割り当てられそうですか? 富豪対応できるならそれでいいとおもいますけど、できないならロジック書き換えが必要かと…。
退会済みユーザー

退会済みユーザー

2018/07/22 10:50

yeild 使う系か…。
mizutama72

2018/07/22 11:10

メモリ増設は、技術的な面でも厳しいと思います。。 yeild というのは、初めて聞いたので、ネットで検索してみましたが、phpのジェネレータ構文というものでしょうか??
退会済みユーザー

退会済みユーザー

2018/07/22 12:32

yeildについてはそうなんだけどね、僕もyeildはほとんど使っこと無い。大体別の古い手法で解決してしまうから。 提示してくれたコード見たんだけど、「なんか変なことやってるなー」って印象なので、 ロジックの書き換えが適切な気はしてる。 じゃあどう書き換えるかっていうともっと細かく全体の仕様が見えないとなんとも言い難いんだけどね。
mizutama72

2018/07/22 13:07

やはり、プログラムがいまいちなのかもしれないですね。。お恥ずかしい。 やっていることは、度数分布をC3.jsのグラフに表示するために、大量の数値データに対して、数値範囲配列(1〜1000など)を参照して、その範囲にあれば個数を数えていく、ということをやっていまして。。 おっしゃる通り仕様の話になってきてしまって、 質問のタイトルと内容が変わってきていますので、一旦クローズしますね。 長々とお付き合い下さり、ありがとうございました!
guest

0

PHP側で調べたエラーファイル等のパスは?
リソースの提示がありませんが、php.iniのsizeを指定した根拠は?メモリに余裕があるならsizeを2倍か4倍にしたらどうなりますか?

MySQL側でエラーは出ていませんか?
MySQLで実行したSQLとそのSQLを実行するために必要なCREATE TABLEや実行計画を提示されると適切なコメントが付き易いのでは?

投稿2018/07/21 04:12

Orlofsky

総合スコア16415

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

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

mizutama72

2018/07/21 05:03

ご回答ありがとうございます。 情報を追記してみました。
退会済みユーザー

退会済みユーザー

2018/07/21 05:19

お風呂兄さんはPHP門外漢だから仕方ない仕方ない。
Orlofsky

2018/07/21 21:18

お風呂じゃくてオルロフスキーだってば。PHPは昔ちょっと勉強しただけ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問