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

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

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

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

JavaScript

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

HTML

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

Q&A

解決済

5回答

2553閲覧

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

ssmxgo

総合スコア178

PHP

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

JavaScript

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

HTML

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

0グッド

1クリップ

投稿2015/07/27 07:02

編集2015/08/06 05:30

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

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

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

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

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

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

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

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

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

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

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

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

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

guest

回答5

0

ベストアンサー

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

とか、いかがでしょう?

投稿2015/07/27 08:56

hintrarou

総合スコア162

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

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

hintrarou

2015/07/27 10:00

ブラウザで編集できる件数を読みだすのに30秒かかるのはちょっとかかりすぎですね。 テーブル構成やSQLを見せていただければもうちょっとアドバイスできると思いますが。
ssmxgo

2015/07/27 10:05 編集

ありがとうございます。 おお、これは!と思いましたが、ちょっと理解に手こずってます。 最後の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|大車輪 のようなイメージです
ssmxgo

2015/07/27 10:20 編集

引き合いに出したものと実際扱ってるテーブルにかなり違いがあって申し訳ありませんが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件が吐出されます。
hintrarou

2015/07/27 13:17 編集

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

2015/07/27 13:22

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

2015/07/27 16:33

NOT LIKEを使わない工夫をしてもいいかもです。 アンケートを保存しながら、その言葉が含まれるか含まれないかのフラグを保存するカラムを追加して、例えば含まれれば1、含まれなければ0を入れておきます。 すでに取り込んでいるデータはバッチ処理で全件あらかじめフラグを立てておけば、次からリアルタイムでデータをダウンロードするときにはNOT LIKEを使うことなく、そのフラグを検索条件に含めると、格段に早くなるはずです。
ssmxgo

2015/07/28 02:41 編集

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

2015/07/28 07:33

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

2015/07/30 09:57

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

2015/07/30 10:43

それは、すでにDBに取り込んでしまってるデータに対して一回だけの操作です。 新たに受け付ける情報は、フォームでアンケートを受け付けながらこのフラグを付けていくようにします。 もし今更フォーム受付部分をいじるのが不可能なら定期的に動かしてもいいと思いますが、それは運用次第です。 まずはこのカラムを追加したテストDBを作って、全体的に軽くなるかテストしてみてはいかがでしょうか? それであまり改善されなければ、フォームをいじっても無駄ですので。
ssmxgo

2015/10/13 06:48

スミマセン、最後のコメント見落としていました。 別件?システムの運用開始と調整にともない全然触れることができませんでした…が、その中でサーバーのメモリの増強で、結果的に問題の解決に至りました。 うーん、これで遅くなる要因は…と、その通りでした。ただ、若干レスポンスが遅いところがあるので、後半の内容を踏まえ改善していこうと思います。 他のコメントにもありますように、非同期処理はまだスキルがないのでおいおいですがLIKEとかの話は基礎的なことでしたので勉強になりました。 ありがとうございました。
guest

0

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

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

投稿2015/10/13 06:49

ssmxgo

総合スコア178

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

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

ssmxgo

2015/12/15 01:44

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

0

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

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

投稿2015/07/27 08:23

eripong

総合スコア1546

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

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

ssmxgo

2015/07/27 09:34

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

2015/07/27 09:44 編集

ありがとうございます。 そうすると、突き合わせやExcelへの出力は関係ないのですね。 単純にセッションに保存することはできないのでしょうか? I/Oは発生しそうですが。
ssmxgo

2015/07/27 10:08

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

2015/07/27 10:13

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

2015/07/27 10:23

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

2015/07/27 15:09 編集

http://php.net/manual/ja/session.configuration.php によると、 session.save_handlerにfilesが指定されていれば(filesはデフォルト値です)、 session.save_pathに保存される様です。 1)2)に挙げた内容は、大丈夫そうですか? どのくらいの想定でしょうか?
eripong

2015/07/27 15:17

また、セッションはmemcachedにも保存できる様ですので、 速度的に問題があれば、そちらを検討しても良いと思います。 その場合でも、2)に書いた単位時間あたりのアクセス数×データサイズで、 メモリ内に収まるかの計算は必要です。
ssmxgo

2015/07/28 02:38

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

2015/10/13 06:42

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

0

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

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

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

などでしょうか

投稿2015/07/27 07:49

kzyplus

総合スコア62

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

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

kzyplus

2015/07/27 08:11

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

2015/07/27 09:32

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

2015/07/27 10:10

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

2015/07/27 10:27

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

0

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

突き合せする分軽くなるだろうとは思いますが、複数人が同時に編集してたりすると不整合起きませんか?

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

これも複数人が同時に編集してたりすると不整合起きませんか?

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

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

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

投稿2015/07/27 07:22

tenraku

総合スコア148

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

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

ssmxgo

2015/07/27 07:30

ありがとうございます。現状としては複数人からの編集は無いのでその部分は大丈夫です。 ちょっと、わかりづらくて申し訳ありません 現行では、保存作業はなく単純にExcelファイルへの書き出しだけです。 例えば、膨大なアンケートをHTML上で表示させる(現在では一覧表示にこだわってます)。そこでユーザーがチェックボックス等をいじり、このユーザーの編集部分のみをPOSTして、アンケートの設問部分をあらためてDBから呼び出して、つけ合わせてExeclの保存処理に投げる…といった感じでしょうか。 HTMLに出力するプロセスと、ユーザがsubmitを押してからのプロセスが別物なので、データを保持できない(HTMLのINPUTの値は保持される)ので、再度読み込まなければならないこの無駄が解決できないかと考えてます。
tenraku

2015/07/27 07:55

--引用-- HTMLに出力するプロセスと、ユーザがsubmitを押してからのプロセスが別物なので、データを保持できない(HTMLのINPUTの値は保持される)ので、再度読み込まなければならないこの無駄が解決できないかと考えてます。 --引用ここまで-- この点はAjaxで非同期でInputの値のChangeイベントで通信といったことをすれば解決できるとは思います。 ただ、軽くなるかと言われたらあんまり。むしろ重くなるかも。という気はします (通信量の増大によるレスポンス悪化)
ssmxgo

2015/07/27 08:55

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問