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

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

ただいまの
回答率

90.33%

  • PHP

    21343questions

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

  • MySQL

    6175questions

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

  • Ubuntu

    1555questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 235

mizutama72

score 23

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 追記
以下のプログラムで落ちてしまうようです。

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


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

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


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

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

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

max_execution_time = 1800

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/21 14:21

    はっ! 30分だった…

    キャンセル

  • 2018/07/21 14:21

    よっぱらってるから仕方ない仕方ない。

    キャンセル

  • 2018/07/21 14:22

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

    キャンセル

  • 2018/07/21 14:24

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

    キャンセル

  • 2018/07/21 14:24

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

    キャンセル

  • 2018/07/21 14:26

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

    キャンセル

  • 2018/07/21 14:28

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

    キャンセル

  • 2018/07/21 14:31

    さらに余談だけど、小分けにしないで別プロセス立ち上げて実行、ブラウザからAjaxでその結果をモニタリング、が、一番理想。

    ま、とりあえず、max_execution_time = 0 で解決するか確認するのが先決で、
    それでなかったら別の問題の切り分けしなきゃいけないから、あれこれ話してもムダだし。

    キャンセル

  • 2018/07/21 15:06

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

    キャンセル

  • 2018/07/21 15:12 編集

    あんまり嬉しい結果じゃなかったね。別の問題ってことか。

    >別プロセス立ち上げて実行というのは、execなどを使用するのでしょうか?

    そう、exec()とかsystem()コマンドで、CLIとしてphpファイルを実行するの。
    ubuntu みたいなLinux系の場合はバックグラウンド実行のオプションが & だったと思うので
    exec("php /path/to/php/file.php &");
    でよかったような…。

    ただし、max_execution_time = 0でダメなら、別の問題っぽいから
    まず、原因が何なのか調べないとダメだろうな。

    キャンセル

  • 2018/07/21 15:19

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

    キャンセル

  • 2018/07/21 15:22

    現在のメモリ使用量をあわせてエラーログを出すと良いね。

    サーバ管理者が辞めて大変だろうけど、のんびりがんばって。

    キャンセル

  • 2018/07/22 10:59

    時間がかかっている箇所がわかりました。
    追記します。

    キャンセル

  • 2018/07/22 19:46

    >foreachでぐるぐるやってしまうと危険なのでしょうか?

    適切にunset()でメモリを解放しない限り、スコープを抜けるまではメモリを消費し続けるのでメモリを食いつぶしてしまいますね。

    キャンセル

  • 2018/07/22 19:49

    PhysMem: 4066M used

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

    キャンセル

  • 2018/07/22 19:50

    yeild 使う系か…。

    キャンセル

  • 2018/07/22 20:10

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

    キャンセル

  • 2018/07/22 21:32

    yeildについてはそうなんだけどね、僕もyeildはほとんど使っこと無い。大体別の古い手法で解決してしまうから。

    提示してくれたコード見たんだけど、「なんか変なことやってるなー」って印象なので、
    ロジックの書き換えが適切な気はしてる。

    じゃあどう書き換えるかっていうともっと細かく全体の仕様が見えないとなんとも言い難いんだけどね。

    キャンセル

  • 2018/07/22 22:07

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

    長々とお付き合い下さり、ありがとうございました!

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/21 14:03

    ご回答ありがとうございます。
    情報を追記してみました。

    キャンセル

  • 2018/07/21 14:19

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

    キャンセル

  • 2018/07/22 06:18

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

    キャンセル

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

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

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

  • PHP

    21343questions

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

  • MySQL

    6175questions

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

  • Ubuntu

    1555questions

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