2011-01-24 4 views
0

Я получаю объекты изображения с удаленного сервера, а затем пытаюсь загрузить их в облачные файлы Rackspace с помощью их API. Удовлетворение а) как я могу сделать этот процесс более эффективным, и б) предполагая, что мне нужно будет приобрести больше памяти, для чего может понадобиться разумное количество ОЗУ (текущий сервер разработки - всего 512 МБ).Управление памятью и большими файлами Linux

При выполнении сценария я:

  • Запрос моих локальной базы данных для набора идентификаторов (около 1 тысячи)
  • Для каждого идентификатора, запрашивая удаленный сервер, который возвращает между 10-20 объекты изображения, каждое изображение 25-30k
  • Создание контейнера облачных файлов на основе идентификатора из моего db
  • Для каждого объекта изображения, возвращенного с удаленного сервера, создайте объект изображения в моем контейнере и запишите данные изображения к этому объекту
  • Обновление строки в локальной БД с DateTime добавленных изображений

Это выполняется относительно быстро на небольшой набор идентификаторов, однако 100 (так 700-1k изображения) может принимать 5-10мин, и ничего больше, чем кажется бежать бесконечно. Пытались следующие, с небольшим успехом:

  • используя set_timeout PHP, чтобы убить скрипт через пару минут, решив, что бы очистить память выделяется на исполнение, что позволяет мне подобрать, где я остановился, и работать через набор меньше штук. Однако эта ошибка никогда не выбрасывается
  • unset ключ массива, содержащий объект изображения после его загрузки (не just the reference inside the loop).

PHP memory_limit установлен в 128 МБ, а команда «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 + никогда не меняется. Я вижу, что есть еще одна задача работает, но эти значения не меняются:

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

Извинения для длинного поста - не совсем уверен, что (если какой-либо из этого) является полезным. Это не моя область знаний, поэтому немного хвататься за соломинку. Заранее спасибо за вашу помощь.

+0

Не можете ли вы обработать одно изображение за другим? – rik

+0

Похоже, вы случайно написали код как своего рода алгоритм N^2 - разместите код. – caf

ответ

0

MySQL - это демон - он будет продолжать работать и сидеть в памяти, пока он не умрет, или вы его не убьете. TIME + - сколько времени процессора используется с момента последнего перезапуска. Если он неактивен (% CPU = 0), тогда TIME + не будет увеличиваться, так как время процессора не потребляется.

Вы проверили, запущен ли API-интерфейс cloudfiles некорректно? Вы можете отключить объект изображения, который вы извлекли из своей службы (service-> you), но Cloudfiles API по-прежнему должен отправить это изображение обратно из двери (you-> Rackspace), и это может быть утечка где-то.

+0

Спасибо за ответ. Был поиск следующего шага, и это определенно помогает. – Jonathon

Смежные вопросы