2011-01-24 106 views
0

我從遠程服務器獲取圖像對象,然後嘗試使用它們的API將它們上載到Rackspace的雲文件。想知道a)如何讓這個過程更高效,b)假設我需要購買更多的內存,那麼完成這項任務的RAM數量是多少(目前的開發服務器只有512MB)。Linux內存管理和大文件

在執行腳本我:

  • 查詢我的本地數據庫的集ID(約1萬)
  • 每個ID,查詢遠程服務器,其中10〜20之間返回圖像對象,每個圖像是25-30k
  • 基於我的分區ID創建一個雲文件容器
  • 對於從遠程服務器返回的每個圖像對象,在我的容器中創建一個圖像對象,並寫入圖像數據到那個對象
  • 在本地數據庫添加了圖像的日期時間210
  • 更新行

此執行相對較快的一個小集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 

...但時間+從不改變。我看到,仍然有1下任務運行,但這些值不會改變:

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

道歉冗長的後 - 不完全知道什麼(如果有的話那)是有用的。這不是我的專業領域,所以一點點抓住吸管。在此先感謝您的幫助。

+0

你不能一個接一個地處理一個圖像嗎? – rik 2011-01-25 00:46:32

+0

這聽起來像是你不小心將代碼寫成某種N^2算法 - 發佈一些代碼。 – caf 2011-01-25 04:19:17

回答

0

MySQL是一個守護進程 - 它將繼續運行並坐在內存中,直到它死亡或者你殺死它。 TIME +是自上次重新啓動以來使用的CPU時間。如果它空閒(%CPU = 0),那麼TIME +不會增加,因爲沒有消耗CPU時間。

您是否檢查過cloudfiles API是否泄漏某種類型的句柄?您可能會將您從服務(服務 - >您)檢索到的圖像對象取消設置,但Cloudfiles API仍然需要將該圖像發回到門外(您 - > Rackspace),並且這可能會泄漏到某處。