0

我正在从远程服务器获取图像对象,然后尝试使用他们的 API 将它们上传到 Rackspace 的云文件。想知道 a) 我怎样才能使这个过程更有效率,以及 b) 假设我需要购买更多内存,完成这个任务可能需要多少合理的 RAM(当前的开发服务器只有 512MB)。

在执行脚本时,我是:

  • 查询我的本地数据库以获取一组 ID(大约 1000 个)
  • 对于每个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),那么 TIME+ 将不会增加,因为没有消耗 cpu 时间。

您是否检查过 cloudfiles API 是否泄漏了某种句柄?您可能正在取消设置从服务中检索到的图像对象(服务->您),但 Cloudfiles API 仍然必须将该图像发送回门外(您->机架空间),这可能会泄漏到某个地方。

于 2011-01-25T03:39:47.427 回答