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

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

ただいまの
回答率

87.34%

大量のJsonデータ受け渡しについて

受付中

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 6,818

サーバサイドに測定データがCSV形式で保存されており
これをPHPで作成したプログラムによりピックアップし
Json形式に変換後クライアントへ送り
クライアント側でjavascriptにより受け取り
テーブルを作成し、テーブルから選択したカラム毎にグラフを作成するアプリを作成しようとしております
PHP側の処理はjson_encodeを使いフォルダー内の全CSVファイルを一括して変換後送出
javascript側の処理はXNLHttpRequestを使いフォルダーを指定してjsonデータを受信するようにしております
フォルダー内にCSVファイルが1つの場合は正常に受信するのですが
フォルダー内にCSVファイルが複数存在する場合エラーとなります
どうやらデータの数が多すぎるとのメッセージが出てるようなのですが
大量のデータを受け渡す良き方法があればご教授ください

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+1

全データが受け取れないなら、諦めて複数にわけてうけとって
クライアント側で結合するような処理になるのでは?
ただオーバーフローするような量のデータをクライアントでなにかしようとするのは
どうかと思いますけど。
集計をするにしても、データ抽出をするにしても、サーバー側でやることではないですか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/02/16 16:33

    javascriptは触るの今回が初めてですので複数に分けて送る方法がよく分かりません
    どのようにすればよろしいでしょうか?

    キャンセル

  • 2018/02/16 16:37

    > 複数に分けて送る方法

    それはjsonを提供しているAPI側の仕様なので、情報がなにもないので
    できるかどうかもわかりません。

    キャンセル

+1

サーバサイドに測定データがCSV形式で保存

ということはCSVの文字列データを全てPHPのメモリ空間へ保存しているわけですね。
からのパース、変数詰め込みでざっとメモリ消費量は2〜3倍になるでしょう。

PHPのメモリ制限やタイムアウト制限落ちている可能性が極めて高いです。
短期的にはphp.iniのこれらの値を調整することで対応できるでしょう。

しかし長期的な対応策を考えると、PHPだけでゴリ押しでCSV→JSON変換をするべきではありません。
MySQL等のデータベースで管理して、オフセット値等のやり取りをしながら複数回に分けてクライアントへ送信する仕組みを構築した方が良いかと思います。

ただまぁ、遅くて良いならob_flushのような機能を使って、CSVの例えば100レコードずつ読み込んで処理するメモリ消費量を温存するやり方もあります。
この場合json_encodeを使ってズドンという手法ではなく、妥当なJSONと思わしき文字列を手作業で作って出力していくような手法になるかと思います。


【追記】

PHP側の処理はjson_encodeを使いフォルダー内の全CSVファイルを一括して変換後送出

ん?そもそもなんでリクエストが来るまでCSVファイルはJSONファイルに出来ないんですか?
クライアントのリクエストを待たずにさっさとJSONにしてしまって、
後はApacheかなんかに任せてしまえば良いと思います。

バッチかなんかで新しいディレクトリが作られたら勝手に変換し始めるスクリプトを作って対応してみてはどうでしょうか?

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/02/16 16:32

    別系統で測定器からのデータを日々FTPでサーバーにアップしている処理系が有り
    アップされたデータからその日の平均値を求める処理があるのですが
    ウェブアプリからデータの確認を行って不要なデーターを選んで削除する必要があり
    (測定機の誤動作等で明らかおかしなデータがたまに発生する為)
    なのでいったんグラフを表示して挙動のおかしなデータを指定してフィードバック
    目視する為テーブルの表示とグラフの表示
    表示した後にテーブルもしくはグラフから所定のデータを指定する必要がある為
    このような処理系を考えましたが
    もっと簡単にできる方法があればご教授お願いいたします

    キャンセル

  • 2018/02/16 21:30

    ちょっとひとまとめにすると重いので細分化して考えて行きましょうか。

    > 別系統で測定器からのデータを日々FTPでサーバーにアップしている処理系が有り
    > アップされたデータからその日の平均値を求める処理があるのですが
    なるほど、これは質問からの想定通りという感じですね。

    > ウェブアプリからデータの確認を行って不要なデーターを選んで削除する必要があり
    > (測定機の誤動作等で明らかおかしなデータがたまに発生する為)
    目視ですか!?まぁ後で考えましょう。なるほど…

    > いったんグラフを表示して挙動のおかしなデータを指定してフィードバックしたい。
    > テーブルやグラフで表紙、目視で不要データを削除したい。
    この辺よくわからなかったので、私の方で文を拾ってつなぎ合わせました。合ってますか?
    質問文と照らし合わせると、データの目視添削はJSONでクライアントに丸投げした後にブラウザ上で行いたいと言ってるわけですね?これも合ってますか?

    以下、上記の文を私の解釈が合ってたとみなしながら考えていきます。

    まず、FTPでアップロードされたCSVは、人が目視で必要・不要を判断するまで勝手に書き換わったりはしませんね?
    アップロードを検知する仕組みを構築してください。
    Linuxの特定ディレクトリを監視する機能を利用しても良いですし、Cronかなにかで定期的に巡回しても良いでしょう。
    新しいCSVが追加されたら、JSONファイルを作成するか、データベースへ登録してください。
    同じCSVファイルを何度も保存しないような仕組みは設計次第なのでよしなに出来るようがんばってください。

    ブラウザからの要求が出てきたら、JSONもしくはデータベースを元に高速なJSONの結果を返します。
    これは回答欄に書いた手法と同じです。

    ブラウザからの添削は、Ajaxによる指示書JSONファイルのアップロードという形ですね。
    突合させて新しいJSONファイルを生成するなり、DBを更新するなりはおまかせします。

    細部は色々工夫出来るかと思いますが、大まかにはこういった感じのやり方がスマートに解決出来るでしょう。

    キャンセル

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

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

関連した質問

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