0

リモート サーバーから画像オブジェクトを取得し、API を使用して Rackspace の Cloud Files にアップロードしようとしています。a) このプロセスをより効率的にするにはどうすればよいか、b) より多くのメモリを購入する必要があると仮定すると、このタスクを達成するのに妥当な RAM の量 (現在の開発サーバーはわずか 512 MB です)。

スクリプトを実行すると、次のようになります。

  • 一連の ID (約 1,000) についてローカル データベースにクエリを実行する
  • 各 ID について、10 ~ 20 個の画像オブジェクトを返すリモート サーバーにクエリを実行すると、各画像は 25 ~ 30k になります。
  • データベースの ID に基づいて Cloud Files コンテナを作成します
  • リモート サーバーから返されたイメージ オブジェクトごとに、コンテナーにイメージ オブジェクトを作成し、そのオブジェクトにイメージ データを書き込みます。
  • 追加された画像の日時でローカルデータベースの行を更新します

これは、ID の小さなセットで比較的迅速に実行されますが、100 (つまり 700 ~ 1k の画像) には 5 ~ 10 分かかる場合があり、それ以上のものは無期限に実行されるようです。次のことを試しましたが、ほとんど成功しませんでした:

  • PHP の set_timeout を使用して数分後にスクリプトを強制終了すると、実行に割り当てられたメモリがパージされると考えられるため、中断したところから再開して、セット全体を小さな部分で処理することができます。ただし、このエラーは決してスローされません
  • アップロード後に画像オブジェクトを含む配列キーの設定を解除します(ループ内の参照だけではありません)。

PHP の memory_limit は 128MB に設定されており、「tops」コマンドを実行すると、ユーザー「www-data」がメモリ リソースの 16% を消費していることがわかります。ただし、ユーザーのリストには表示されなくなりましたが、引き続きこれが表示されます。

PID  USER      PR   NI VIRT RES  SHR  S %CPU %MEM  TIME+    COMMAND
2400 mysql     20   0  161m 8220 2808 S    0  1.6  11:12.69 mysqld

...しかし、TIME+ は決して変化しません。まだ 1 つのタスクが実行されていることがわかりますが、これらの値は変わりません。

Mem:    508272k total,   250616k used,   257656k free,     4340k buffers

長い投稿をお詫びします - 何が役立つか (もしあれば) は完全にはわかりません。これは私の専門分野ではないので、ストローを少しつかみます。よろしくお願いします。

4

1 に答える 1

0

MySQLはデーモンです-それは実行を続け、死ぬかあなたがそれを殺すまでメモリに留まります。TIME +は、最後の再起動以降に使用されたCPU時間です。アイドル状態(%CPU = 0)の場合、CPU時間が消費されていないため、TIME+はインクリメントされません。

cloudfiles APIが何らかのハンドルをリークしていないかどうかを確認しましたか?サービスから取得した画像オブジェクトの設定を解除している可能性がありますが(service-> you)、Cloudfiles APIはその画像をドアの外に送信する必要があり(you-> Rackspace)、どこかにリークしている可能性があります。

于 2011-01-25T03:39:47.427 に答える