0

基本的な前提が2つのファイルがあるWebサイトを構築しています。index.php と file.txt。

File.txt には (現在) 10 メガバイトのデータがあり、最大 500 メガバイトになる可能性があります。このサイトのアイデアは、人々が index.php にアクセスしてから、ファイルの任意の位置をシークできるというものです。もう 1 つの機能は、シーク ポイントから最大 10kb のデータを読み取ることができることです。そう:

index.php?pos=432ファイルの位置 423 にあるバイトを取得します。

index.php?pos=555&len=5000位置555から始まるファイルから5kbのデータを取得します

では、サイトが 1 日に何千ものアクセスを獲得していると想像してください。

現在、データを提供するためfseekに とを使用しfreadています。これを行うより速い方法はありますか?それとも、各リクエストの結果をキャッシュする、ファイルをメモリにロードしてそこから読み取るなどの高度な最適化を検討するには、使用量が少なすぎるのでしょうか?

4

4 に答える 4

0

ファイルが変更されず、最大サイズが本当に制限されている場合は、単純にramdiskをマウントし、永続ストレージから RAM ストレージにファイルをコピーするブート スクリプトを作成します。

Linux でサイトをホストしていない場合は、おそらくこれが必要です。

これにより、OS ファイルシステムのキャッシュに依存することなく、ファイル セグメントがメモリから提供されることを保証できます。

于 2013-08-02T19:24:25.517 に答える
0

編集:バイトオフセットに移動するために使用fseek()し、特定のバイト数を取得するために使用している限り、問題になることはありません。何らかの理由で、あなたの質問を、ファイルから Xの数を提供していると読みましたが、これは本当にひどいものです。fread()


問題は、IO 操作でディスクを完全に叩いていることです。この 1 つのファイル/スクリプトでパフォーマンスの問題を引き起こしているだけでなく、そのディスクを必要とするすべてのものでパフォーマンスの問題を引き起こしています。他のユーザー、OS など。共有ホスティングを使用している場合は、システム管理者の 1 人があなたが誰であるかを突き止めようとしていることを保証します。[私はそのようになります]

次のいずれかの方法を見つける必要があります。

  1. これをメモリにオフロードします。
    ファイルをメモリにロードし、要求に応じてチャンクを提供するデーモンをサーバーにセットアップします。
  2. これを、mySQL などのより効率的なものにオフロードします。
    たとえば、466 行目から 476 行目では、データを順次チャンクで提供しています。次のようなテーブルからデータを取得する方がはるかに高速です。

    CREATE TABLE mydata (
      line INTEGER NOT NULL AUTO_INCREMENT,
      data VARCHAR(2048)
    ) PRIMARY KEY (line);
    

    に:

    SELECT data FROM mydata WHERE line BETWEEN 466 AND 476;
    
于 2013-08-02T19:15:31.977 に答える