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

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

ただいまの
回答率

90.48%

  • PHP

    20912questions

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

  • JavaScript

    17083questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • HTML

    9328questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • Excel

    1599questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

DBから読み出した大きめのデータをHTMLで編集→Excelファイルへ書き込む際の効率的手段について

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,035

ssmxgo

score 137

すみません、ヒントを教えて下さい。
素人で言葉足らずなのでお手数おかけできません。

PHPでDBから大きめのデータを引き出してきて、表形式で表示した後、ユーザがブラウザから表の値をいじりそれをエクセルでダウンロードするというコードを書いてます。

さて質問ですが、一度目の読込、編集し、ダウンロードする部分は問題ないのですが、ダウンロード前に再度DBからデータを読み込んで、編集した値をPOSTで取り込んでつき合わせて、Excelの出力に生成しなおしているのですが、データ量が多くて遅い…

そこで、これらを効率良く行う手段がわかればヒントでいいので教えて下さい。現状では

1.全ての表をInput形式で表示し、編集後すべての値をPOSTしてDBの再読み込みはしない(現段階では必要な物のみINPUT出力、その他のデータはDBから再読み込み→突き合わせ→Excel)

2.何かしらのキャッシュを利用する。Cookie? Session? SQLiteとか? 素人なんで調べてみないとわかりません

という形でレスポンスが向上できるか検討していこうと考えていますが、それ違うだろ!みたいなツッコミよろしくお願いします。

★みなさん、懇切丁寧にありがとうございます★
ちょっとレスポンスまで数日くださいませ(-_-;)ホント質問しといて申し訳ありません
★★★
すみません、本当に手が回らなくて返信できない状態です。必ず返信いたします。
みなさん、本当に申し訳ありませんm(_ _;)m m(_ _;)m m(_ _;)m
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 5

checkベストアンサー

+2

・アンケートの回答テーブルにユニークなIDを振る-A
・アンケートのIDに対応した修正分のデータを保存するテーブルを別に作る。-B
・ブラウザから修正したものは一度にPOSTするのではなく、修正される都度Ajaxでサーバに送ってBに保存する。changeやblurのイベントで送信するか、1レコードごとボタンをクリックして明示的に送信。
・ダウンロードする際はABのテーブルの情報をマージしながらブラウザに書き出し。

とか、いかがでしょう?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/07/27 19:00

    ブラウザで編集できる件数を読みだすのに30秒かかるのはちょっとかかりすぎですね。

    テーブル構成やSQLを見せていただければもうちょっとアドバイスできると思いますが。

    キャンセル

  • 2015/07/27 19:02 編集

    ありがとうございます。
    おお、これは!と思いましたが、ちょっと理解に手こずってます。

    最後のABをマージしながらブラウザに書き出すとはどういうことでしょうか?
    (もちろん、こちらの質問が悪すぎるといことでもうしわけありませんが前提です)

    (最初に書けばよかった)例えば、
    データベース
        名前  住所 逆上がり 大車輪
    1   山田太郎|住所| X  | 
    2   山太一郎|住所|    |  X
    3   山駄三郎|住所|    |

    10000 山出汁郎|住所| X  |
    ブラウザ上
    1   Text表示 山田太郎 Txt住所 逆上がりinput[  ] 大車輪input[ X ]
    2   Text表示 山太一郎 Txt住所 逆上がりinput[ X ] 大車輪input[ X ]
    3   Text表示 山駄三郎 Txt住所 逆上がりinput[  ] 大車輪input[  ]

    10000 Text表示 山出汁郎 Txt住所 逆上がりinput[ X ] 大車輪input[  ]

    こんな入力画面に対して(単純なText表示も多い)、Excel出力も
    1   山田太郎|住所|逆上がり|大車輪X
    2   山太一郎|住所|逆上がりX|大車輪X
    3   山駄三郎|住所|逆上がり|大車輪

    10000 山出汁郎|住所|逆上がりX|大車輪

    のようなイメージです

    キャンセル

  • 2015/07/27 19:19 編集

    引き合いに出したものと実際扱ってるテーブルにかなり違いがあって申し訳ありませんがSQL文としてはこんなかんじです。(ただ、諸事情によりちょっと変更してあります、またフレームワークで吐き出してるので、手直しの際少々誤りがあったらもうしわけありません)

    select エトセトラ from kihons
    left join groups on kihons.group_code = groups.group_code
    where kihons.tenmei NOT LIKE '%▼%' AND
    add_fax IS NOT NULL AND
    (add_fax_status != '拒否' OR
    add_fax_status IS NULL)

    やく8000件が吐出されます。

    キャンセル

  • 2015/07/27 20:20 編集

    うーん、これで遅くなる要因は、like ぐらいなんですが、kihonsとgroupsのgroupe_codeにはインデックスはってますか?

    キャンセル

  • 2015/07/27 22:22

    Excel出力は、PHPExcelとかのモジュールを使ってますか?
    これらのモジュールはだいぶメモリ食うので、php.iniでmemory_limitの上限をあげるとか、ini_setでメモリ上限をあげる必要もあります。

    キャンセル

  • 2015/07/28 01:33

    NOT LIKEを使わない工夫をしてもいいかもです。
    アンケートを保存しながら、その言葉が含まれるか含まれないかのフラグを保存するカラムを追加して、例えば含まれれば1、含まれなければ0を入れておきます。

    すでに取り込んでいるデータはバッチ処理で全件あらかじめフラグを立てておけば、次からリアルタイムでデータをダウンロードするときにはNOT LIKEを使うことなく、そのフラグを検索条件に含めると、格段に早くなるはずです。

    キャンセル

  • 2015/07/28 09:08

    もう一つ。
    8000レコードあるということですので、一度に送信できるpostの値の総数の上限も上げておく必要があります。

    http://www.php-factory.net/trivia/14.php

    キャンセル

  • 2015/07/28 11:32 編集

    ありがとうございます。
    PHPExcelです。これはmemory_limitの上限をあげてます。
    そっか、NOT LIKEが足かせになってる可能性は大きいですねぇ(-_-;)
    インデックス、POSTの上限を上げるにつきましては確認遅くなります、申し訳ありません、とりあえずお礼まで。

    キャンセル

  • 2015/07/28 16:33

    考えてみたら、すでに取り込んでる文はバッチなんかなくても、SQLだけで言葉を含んでいるかどうかのフラグがつけられますね。
    UPDATE テーブル名 set フラグカラム名 = 1 where tenmei LIKE '%▼%'

    キャンセル

  • 2015/07/30 18:57

    ちょっと、現在時間がなくておまたせしてる状態です、皆さん申し訳ありません。
    UPDATE テーブル名 set フラグカラム名 = 1 where tenmei LIKE '%▼%'
    これはユーザリクエストとは別に、常時定期的に動かすという意味ですかね?あるいは書き込み時に…

    キャンセル

  • 2015/07/30 19:43

    それは、すでにDBに取り込んでしまってるデータに対して一回だけの操作です。

    新たに受け付ける情報は、フォームでアンケートを受け付けながらこのフラグを付けていくようにします。
    もし今更フォーム受付部分をいじるのが不可能なら定期的に動かしてもいいと思いますが、それは運用次第です。

    まずはこのカラムを追加したテストDBを作って、全体的に軽くなるかテストしてみてはいかがでしょうか?
    それであまり改善されなければ、フォームをいじっても無駄ですので。

    キャンセル

  • 2015/10/13 15:48

    スミマセン、最後のコメント見落としていました。
    別件?システムの運用開始と調整にともない全然触れることができませんでした…が、その中でサーバーのメモリの増強で、結果的に問題の解決に至りました。

    うーん、これで遅くなる要因は…と、その通りでした。ただ、若干レスポンスが遅いところがあるので、後半の内容を踏まえ改善していこうと思います。
    他のコメントにもありますように、非同期処理はまだスキルがないのでおいおいですがLIKEとかの話は基礎的なことでしたので勉強になりました。
    ありがとうございました。

    キャンセル

0

1.全ての表をInput形式で表示し、編集後すべての値をPOSTしてDBの再読み込みはしない(現段階では必要な物のみINPUT出力、その他のデータはDBから再読み込み→突き合わせ→Excel) 
突き合せする分軽くなるだろうとは思いますが、複数人が同時に編集してたりすると不整合起きませんか?

2.何かしらのキャッシュを利用する。Cookie? Session? SQLiteとか? 素人なんで調べてみないとわかりません 
これも複数人が同時に編集してたりすると不整合起きませんか?

思いつくネタとしては
1.保存する処理とExcelファイルを取得する処理を別のボタンで起動すると保存処理とExcel出力処理で分かれるので多少は軽く感じるようにはなるかも

2.突き合せの処理の見直し。Excel側で突き合せようとすると処理が重い。DB側(SQL等)に任せるように変更する

といったところでしょうか。



投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/07/27 16:30

    ありがとうございます。現状としては複数人からの編集は無いのでその部分は大丈夫です。

    ちょっと、わかりづらくて申し訳ありません
    現行では、保存作業はなく単純にExcelファイルへの書き出しだけです。

    例えば、膨大なアンケートをHTML上で表示させる(現在では一覧表示にこだわってます)。そこでユーザーがチェックボックス等をいじり、このユーザーの編集部分のみをPOSTして、アンケートの設問部分をあらためてDBから呼び出して、つけ合わせてExeclの保存処理に投げる…といった感じでしょうか。

    HTMLに出力するプロセスと、ユーザがsubmitを押してからのプロセスが別物なので、データを保持できない(HTMLのINPUTの値は保持される)ので、再度読み込まなければならないこの無駄が解決できないかと考えてます。

    キャンセル

  • 2015/07/27 16:55

    --引用--
    HTMLに出力するプロセスと、ユーザがsubmitを押してからのプロセスが別物なので、データを保持できない(HTMLのINPUTの値は保持される)ので、再度読み込まなければならないこの無駄が解決できないかと考えてます。
    --引用ここまで--
    この点はAjaxで非同期でInputの値のChangeイベントで通信といったことをすれば解決できるとは思います。

    ただ、軽くなるかと言われたらあんまり。むしろ重くなるかも。という気はします
    (通信量の増大によるレスポンス悪化)

    キャンセル

  • 2015/07/27 17:55

    そっか〜〜〜。実現というところでは出来ないのかもしれないですけどそういう発想はありませんでした、目からうろこ。
    ありがとうございました。

    キャンセル

0

ブラウザや環境によってpostできる数に限りあるので、まともに全部値を投げるのはデータ量によっては、あまり好ましくないかもしれないですね。

思いつきなんで穴だらけですが、例えば

①DBから読み込んだ時点でダウンロード用のファイルに書き出す
②ユーザーが任意の項目を修正したら、変更が加えられたそのイベントを検知して、非同期で①で保存したファイルを修正
③ダウンロードするときにはそのファイルをまんダウンロード

などでしょうか

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/07/27 17:11

    補足:②の非同期のブログラムは修正が加えられたデータをピンポイントで修正するだけのものです

    キャンセル

  • 2015/07/27 18:32

    ありがとうございます!
    なるほど、tenrakuさん同様、非同期処理ですね(^o^;)技術的についていけるか…
    これはCSVじゃなくて、SQLiteみたいのでもアリということでしょうかね?

    キャンセル

  • 2015/07/27 19:10

    確かに、データ量が膨大なら、ファイルを都度読み込んで、配列に展開して修正箇所だけ直したものを再度ファイルに書き出すってやると、メモリ食ってしまいそうだから、本体に影響の出ない一時テーブル作ってそこに対して、データを都度更新して、一括出力がいいかもしれないですね。
    ちなみに、テーブルの内容を一括で出したい場合、selectするよりダンプでcsv出力とかするほうが高速かもしれないんで、システムコマンドの使用も含め検証してもらえたらと思います

    キャンセル

  • 2015/07/27 19:27

    へ〜〜〜〜〜!そうなんですね。
    だいぶイメージと食い違いましたが、たしかにベタで出すわけだから平文の方が早いというのは納得です

    キャンセル

0

前提として、何が遅いかは計測しているでしょうか?
もし計測していなければ、どこを改善すべきか分からないので、
ログを入れるなどして各処理の所要時間を測ってみてください。
(DBからの読み込み、突き合わせ、Excelへの出力ぐらいに分ければ良いと思います。)

所要時間が分かっていれば、教えていただけないでしょうか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/07/27 18:34

    すみません、あえてログを吐いて計測迄していませんが、間違いなくDBからの読み出しに時間がかかっています。所要時間は30秒くらいでしょうか。
    付随してHTML表示をさせると遅くはなりますが、これは回線速度により…で、あきらめている部分があります。なので二度のDBの読込を避ける事ができれば…と思ってます

    キャンセル

  • 2015/07/27 18:40 編集

    ありがとうございます。
    そうすると、突き合わせやExcelへの出力は関係ないのですね。

    単純にセッションに保存することはできないのでしょうか?
    I/Oは発生しそうですが。

    キャンセル

  • 2015/07/27 19:08

    ごめんなさい、素人でしてまだ確認ができていませんが、これだけ大きなデータ(DBからの呼び出しに時間がかかるもの)をセッションに保存していいのか?(問題がおこらないのか?)というツッコミも期待して質問させていただきました。
    参考にならないかもしてませんが、Excelファイルにして5MB近くです

    キャンセル

  • 2015/07/27 19:13

    PHPのセッションに詳しくないのですが、
    ディスクに保存されるもののようなので、
    1) ユーザー数×データサイズがディスク容量を圧迫しないか
    2) 単位時間あたりのアクセス数×データサイズのI/Oが発生して問題ないか
    がクリアされていれば、
    良いのでは無いでしょうか?

    それと使い終わったら消しておいた方が良いですね。

    キャンセル

  • 2015/07/27 19:23

    そうなんですか???? それは知りませんでした。だとするとJavascriptがわからない私には一番現実味があるかもしれません。ありがとうございました

    キャンセル

  • 2015/07/28 00:05 編集

    http://php.net/manual/ja/session.configuration.php
    によると、
    session.save_handlerにfilesが指定されていれば(filesはデフォルト値です)、
    session.save_pathに保存される様です。

    1)2)に挙げた内容は、大丈夫そうですか?
    どのくらいの想定でしょうか?

    キャンセル

  • 2015/07/28 00:08

    また、30秒かかるクエリについては、
    実行計画を取得してみることをおすすめします。
    参考URL:
    http://nippondanji.blogspot.jp/2009/03/mysqlexplain.html

    キャンセル

  • 2015/07/28 00:17

    また、セッションはmemcachedにも保存できる様ですので、
    速度的に問題があれば、そちらを検討しても良いと思います。

    その場合でも、2)に書いた単位時間あたりのアクセス数×データサイズで、
    メモリ内に収まるかの計算は必要です。

    キャンセル

  • 2015/07/28 11:38

    ありがとうございます。
    1)2)に関しては範疇外でしてちょっと調べないとわからないです(そもそも調べられるか??(^o^;))
    実は稼働してみないとコストはわかりませんが、データ容量は5MBですがユーザー数はしれてます。

    それ以外のご返答遅くなると思います、もうしわけありません。

    キャンセル

  • 2015/10/13 15:42

    大変お返事遅れて申し訳ありません、別件で時間が取られ手付かずになってしましました。今回はまさにコードの問題というより、サーバーのメモリが問題であることが発覚いたしました。メモリを増強することで解決いたしました。
    お返事大変遅くなって申し訳ございませんでしたが、とても勉強になりました。

    キャンセル

0

AWSを利用していましたが、AWSに割り当てられたメモリが非常に小さかったのが原因でした。
本当にご迷惑おかけしました。

と、同時に御返事遅くなって申し訳ございませんでした。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/12/15 10:44

    うわ〜〜〜〜、よく使い方知らなかったんですけど…、こんなに手伝っていただいて自分をベストアンサーにしてしまった(;´Д`)(;´Д`)(;´Д`)
    本当に失礼しました

    キャンセル

関連した質問

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

  • PHP

    20912questions

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

  • JavaScript

    17083questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • HTML

    9328questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • Excel

    1599questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

  • トップ
  • PHPに関する質問
  • DBから読み出した大きめのデータをHTMLで編集→Excelファイルへ書き込む際の効率的手段について