我们的应用程序目前的工作方式如下:
class myClass{
private $names = array();
function getNames($ids = array()){
$lookup = array();
foreach($ids as $id)
if (!isset($this->names[$id]))
$lookup[] = $id;
if(!empty($lookup)){
$result;//query database for names where id in $lookup
// now contains associative array of id => name pairs
$this->names = array_merge($this->names, $result);
}
$result = array();
foreach($ids as $id)
$result[$id] = $this->names[$id];
return $result;
}
}
哪个工作正常,但它仍然(通常会)导致多个查询(在这种情况下为400+)。
所以,我想简单地查询数据库并使用数据库中的每个名称填充$this->names
数组。
但我担心数据库中有多少条目我应该开始担心内存这样做? (数据库列是varchar(100))
答案 0 :(得分:7)
你有多少记忆?在高峰访问时间内,您的服务通常支持多少并发用户?这些是相关的信息。没有它们,任何答案都是无用的。通常,这是通过负载测试容易解决的问题。然后,找到瓶颈并进行优化。在此之前,只需使其工作(在合理范围内)。
如果你真的想知道你在看什么......
如果我们假设您没有存储多字节字符,那么您有400个名称* 100个字符(假设每个名称都超出您的字符数限制)...您正在查看~40Kb的内存。似乎太无关紧要了,不是吗?
显然,您将从PHP获得其他开销来保存数据结构本身。您是否可以使用SplFixedArray
等数据结构而非普通array
更有效地存储内容?可能 - 但是你失去了高度优化的array_*
函数,否则你必须操纵列表。
用户是否会使用您计划在内存中缓冲的每个条目?如果您必须将它们用于您的应用程序,它们的重要程度并不重要,是吗?在内存中保存大量不需要的信息并不是一个好主意“只是因为。”您绝对不想做的一件事是在每个页面加载时查询数据库以获得4000条记录。至少你需要将这些类型的事务放入内存存储器,如memcached或使用APC。
这个问题 - 就像计算机科学中的大多数问题一样 - 只是一个受约束的最大化问题。除非您知道可供使用的变量,否则无法正确解决。
答案 1 :(得分:3)
一旦你获得了超过一千个项目,键入的查找开始变得非常慢(当你访问一个特定的密钥时有一个延迟)。您可以使用ksort()来解决这个问题。 (我看到一个脚本从15分钟的运行时间下降到不到2分钟,只需添加一个ksort)
除此之外,你实际上只受到记忆的限制。
更好的方法是在脚本中构建一个缺失数据数组,然后使用IN列表在一个查询中获取所有数据。
如果你能提供帮助,你真的不应该浪费内存存储用户永远不会看到的数据。