内存/优化问题

时间:2009-05-15 15:55:43

标签: php mysql optimization memory-management

我正在处理一个复杂的脚本,可以处理多达500,000条记录。这是我的问题。

基本上我的代码将解析一个文本文件以获取每个500,000左右的记录。每条记录都有一个类别,我的代码需要检查在该特定处理过程中是否为该类别创建了categories表中的新记录,如果没有,它将创建该记录。

所以我有两个选择:

1)我存储了一组包含类别名称和ID的keys =>值,所以我可以这样做:

if (array_key_exists($category,$allCategories))
   $id=$allCategories[$category];
else
{
   mysql_query("INSERT INTO categories (procId,category) 
                       VALUES ('$procId''$category')");
   $id=mysql_insert_id();
   $allCategories[$category]=$id;
}

2)每次处理此文本文件时,它都会获得自己的进程ID。因此,我可以这样做,而不是检查可能增长到100,000个以上的$allCategories变量:

SELECT id FROM categories WHERE procId='$procId' AND category='$category'

这里的缺点是将为500,000多条记录中的每条记录运行此查询。而在数组中保存所有类别的缺点是我的内存不足或服务器可能崩溃。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

您能保留一份已插入的ID列表吗?如果它们是整数id,则每次为4个字节,100,000个条目仅使用大约400K的内存。

ETA:

为避免存储类别名称,请对名称进行哈希并存储哈希值。使用128位MD5哈希,即每个哈希16个字节或仅大约1.6MB内存+开销。

答案 1 :(得分:1)

一个想法是在表上添加约束,以便数据库拒绝重复的插入。 然后继续插入所有记录并让db进行检查。

答案 2 :(得分:1)

鉴于你的平均类别名称是30个字节,你只需要30 * 500000字节= 15000000字节= 15000千字节= 1.5兆字节。

我认为你有这么多记忆。