2016-04-05 7 views
0

私はいくつかのハイレゾファイルをサービスに保存しています(重要な場合は100K +)、私は別のギャラリーでそれらを整理します。誰かがギャラリーにアクセスすると、サムネイルと画像のローレア・バージョンのみが表示されますが、場合によっては透かしが入っていない場合もあります。さて、ギャラリーのページに表示される低解像度のバージョンは、X日後にサーバーから削除されます。誰かがギャラリーにアクセスしていて、ファイルのローレストバージョンがサーバー上に存在しない場合、それはオンザフライで生成されますが、ローレスを生成すると、ウォーターマークを付ける必要があるかもしれません。PHPのパフォーマンスstrposのファイル名またはMySQLのクエリ

if (strpos($file_name,"FREE")===false){ //add watermark }else{ //just resize} 

現在、画像を表示するスクリプトは、任意のSQLは、それがすべてのファイルシステムに基づいています(ファイルが存在する場合、など)と画像かを透かしする決定が基づいている呼んでくださいしません

私のロジックは、ファイル名またはファイルIDに対してSQLクエリを実行し、ウォーターマークの付いていないイメージにする必要があるかどうかを確認するよりもパフォーマンスが優れていると言います。しかし、私はそれが無料の単語を含むファイル名を持っているのは少し不便だと思う。

strposの代わりにSQLクエリを使用した場合のパフォーマンスの差はどれくらいですか?

  • システムがかけて添加されている全てのギャラリーで、数年間のために働いするように設計されている:回答やコメントを要約する

    EDIT/UPDATE

    まだアクセス可能な時間。これは、ストレージの要件が巨大であることを意味し、古いアルバムの高解像度画像は、低速で安価な専用ストレージでオフサイトに移動されるため、サムネイル全体からさらにオーバーヘッドを取り除くことは重要な選択肢ではありません。昨年、私は3TB以上の画像を保存する必要がありました(これは高さのサイズのみです)。

  • 私はLighttpdを利用していますので、既存のサムネイルで最高のパフォーマンスを得るにはrewrite-if-not-fileを使用するつもりです。

  • 私はI/O書き込みペナルティについて知っており、必要最小限に抑え、必要な場合にのみ、好ましくは読み込みを行います。しかし、@ N.Bのコメント。実際にSSDにローレス画像を保存することを考えました。ディスクに作成して書き込む必要がある場合でも、通常のHDDよりもはるかに優れたI/Oパフォーマンスを備えています。

  • 私はスケジュールが遅れており、今月末までにシステムを稼働させる必要があります。 (私はちょうど彼らが古いシステムのプラグを引っ張っている爆弾を今日持っている)。はい、柔軟性が私がSQLを使いたいという主な理由ですが、私はSQLデータベースが大きく成長することを期待しています。ファイル情報のほかに、私も同様に保存する必要がある他の情報がたくさんあります。 、ダウンロードなどが含まれています。そのため、SQLに多大なプレッシャーをかけていないことを確認しています。

+1

ファイル名に 'FREE'タグはどこにありますか?本当にSQLクエリを避けたいのであれば、memcachedやその他のKVストアをキャッシュに使用したり、タグをファイル名やパスの特定の位置に置いたりすることができます。 – Pred

+0

あなたのパフォーマンスのペナルティは、ファイル名を扱うのではなく、ディスクへの書き込みの形になります。 MySQL、ファイルシステムなどを使用する場合でも、ディスクへの書き込みが始まると、スクリプトは遅くなります。したがって、どのようなソフトウェアを使用する場合でも、制約要因は作業を実行するドライブのI/O機能になります。これはもう一つのXYの問題です。あなたの心の中で解決策を提示する2つのアプローチ間のアドバイスを求めていますが、実際の問題はまったく別のところです。 –

答えて

1

テストを行うことなく、どちらのアプローチがより高速になるかを特定することは困難です。シンプルなロジックは、PHPにアクセスするディスクが高速であることを示唆しているかもしれませんが、それは多くの前提に基づいています。

よく構成されたシステムでは、頻繁に必要とされる変数は、ディスクではなくRAMキャッシュに格納されます。これは、ファイルシステムのキャッシュとMySQLキャッシュインデックスに適用されます。キャッシュやその他のメカニズムの影響は、期待される結果と異なる結果をもたらす可能性があります。

多くのシナリオでは、いずれかの要求がうまく設計されたシステムで最小限に抑えられ、1つのアプローチの余計なパフォーマンスが「無料」を使用して見つけた不便さに値しない場合があるため、ファイル名に。両方の方法を試してパフォーマンスを測定するのは難しいことではありません。

長期的には、MySQLがすべての状態がファイル名に格納されていると複雑になる追加機能を追加するための柔軟性が増すことも考慮してください。

パフォーマンスが本当に重大な問題である場合は、Webサーバーを使用してディスク上のファイル(またはmemcacheのようなキャッシュ)を調べ、存在する場合はPHPに要求を渡す前にそれを返します。 NginxとApacheの両方がこれを行うことができます。トラフィックの多いWebサイトでは一般的な加速アプローチです。

1

あなたはすでに難しい部分を行っています。あなたのケースのSQLクエリはあなたを遅らせるだけです...MySQLは、この中に来ればここ

は、あなたがそれを

user--->php-->filesystem-->php--->user 

をやっている方法です、それはMySQLを使用していないながら、そう、あなたはすでに自分自身にいくつかの時間を節約している

user--->php--->mysql--->filesystem--->mysql-->php--->user 

を行く方法です...

+1

あなたが言いましたが、彼が言ったように、彼はギャラリーに画像を保存しています(私は彼が別々のフォルダを意味すると思います)ので、OPが間違ったコードを – Chay22

+0

で書いた場合、それは間違っている? – Aurangzeb

+1

サムネイルの表示/生成には、スクリプトのGETパラメータへのパラメータを使用して、年ごと、アルバムごとに別のフォルダ構造を削除します。ありがとう、私は同じロジックを頭に... –

1

誰かがギャラリーにアクセスし、そのファイルのローレストバージョンがサーバー上に存在しない場合、その場で生成されます。

データベースに格納されていないがサーバーファイルとして保存されている場合、これは高解像度画像に比例して低解像度サムネイルが非常に小さい領域を占めることを意味します。例えば、低解像度画像が高解像度画像のサイズの10%であると仮定します。 すべてあなたのサーバで利用可能な低解像度画像は、ストレージのニーズに10%しか追加しません。また、10%の空き容量がない場合は、回避策をプログラミングしないようにストレージを増やす必要があります。

このコメントから、ファイルに関する情報がデータベースに既に保存されているように見えます。これが当てはまる場合は、列を追加して空きであるかどうかを判断し、他の情報を照会するのと同時に余分な列を取得し、オーバーヘッドがほとんどないようにする必要があります。

+0

いいえ、純粋な自殺になるテーブルにバイナリデータを保存しないでください:)私はSQLにファイル関連情報(ファイル名、フォルダ名、ファイル作成日)を保存します。あなたが1年に約800Kの画像の回り道を扱うとき、相対的なものはほとんどありません。 –

+1

ファイルサーバーには高解像度の画像がたくさんあります。すべての低解像度画像を生成することができるのは、ディスクストレージに10%(公称)を追加するだけで、10%の空き容量がない場合は、より多くのストレージを購入する必要があるからです。 – vogomatix

+0

あなたのコメントに基づいて編集されたオリジナルの回答 – vogomatix

関連する問題