3

GET リクエストから画像を配信する API を備えたサーブレットがあります。サーブレットは、GET 要求のパラメーターに基づいて CAD コマンドのデータ ファイルを作成します。このデータ ファイルは、ファイル システム上にイメージを作成するイメージ パーサーに配信されます。サーブレットはイメージを読み取り、応答でバイトを返します。

すべての IO とイメージ パーサー プログラムの呼び出しは非常に負担になる可能性があり、約 80 KB のイメージがローカル システムで 3 ~ 4000 ミリ秒でレンダリングされます。

GET リクエストを構成するパラメータはおよそ 20 個あります。それぞれが画像の異なる部分に対応しています。したがって、可能な画像の組み合わせは非常に大きくなります。

読み込み時間を短縮するために、レンダリングされた画像の BLOB をデータベースに保存する予定です。GET リクエストが以前に実行されたものと一致する場合、キャッシュから取得します。それ以外の場合は、新しいものをレンダリングします。これは「初回」の実行を修正しませんが、「n+1 回の実行」には役立ちます。

パフォーマンスを向上させる方法について他にアイデアはありますか?

4

2 に答える 2

2

通常、データベースストレージはファイルシステムストレージよりも高価であるため、ファイルをディスクに保存し、イメージパスをデータベースに保存できます。

http get パラメータをソートし、パラメータによる高速なクエリのために、そのイメージ レコードへのインデックスとしてそれらをハッシュします。

ディスク容量が足りないときにプログラムがクラッシュしないようにするには、未使用またはほとんど使用されていないレコードを削除する必要があります。

画像が要求されるたびに更新される、各レコードの lastAccessedTime を保存します。

スケジューラーを使用して lastAccessedTime をチェックし、指定された重みよりも低いレコードを削除します。lastAccessedTime、accessedCount、画像サイズなど、さまざまな戦略を使用して重みを計算できます。

于 2012-12-17T05:01:19.803 に答える
1

レンダリング パイプラインにフィードするすべてのパラメーターを予測可能な方法で単一の文字列に変換して、入力の SHA1 ハッシュを計算し、SHA1 をファイル名として使用して出力ファイルをディレクトリに保存することができます。同じパラメーターでリクエストを受け取った場合は、ハッシュを計算し、ファイルがディスク上にあるかどうかを確認し、そうでない場合は作業をレンダー パイプラインに送信し、ファイルを作成します。

複数のディレクトリを使用したいファイルがたくさんある場合は、インスピレーションを得るために、SHA1 の最初の数文字で git がディレクトリ間でファイルを分割する方法を見てください。

私は自分のアプリで同様の設定を使用しています。ファイルを保存するだけでレンダリングを行っていません。ファイルはデータベースに保存されていますが、パフォーマンス上の理由から、ファイルの内容の sha1 ハッシュをファイルのファイル名/URI として使用して、ディスクからそれらを提供しています。 .

于 2012-12-17T05:21:25.097 に答える