リモート サーバーから画像オブジェクトを取得し、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
長い投稿をお詫びします - 何が役立つか (もしあれば) は完全にはわかりません。これは私の専門分野ではないので、ストローを少しつかみます。よろしくお願いします。