我正在处理一个复杂的脚本,它可以处理多达500,000条记录。这是我的问题。
基本上,我的代码将解析一个文本文件,以获得大约500,000条记录中的每条记录。每条记录都有一个类别,我的代码将需要检查在该特定处理过程中是否在categories表中为该类别创建了一个新记录,如果没有,它将创建该记录。
所以我有两个选择:
1)我存储了一个包含类别名称和ID的keys=>values数组,所以我可以这样做:
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。因此,我可以这样做,而不是检查$allCategories变量,该变量可能会增长到具有100,000+条目:
SELECT id FROM categories WHERE procId='$procId' AND category='$category'这里的缺点是,将为每个500,000+记录运行此查询。然而,在一个数组中保存所有类别的缺点是,我可能会耗尽内存,或者服务器可能会崩溃。
有什么想法吗?
发布于 2009-05-15 16:00:52
你能不能只保留一个你已经插入的ids列表?如果它们是整数If,即每次4字节乘以100,000个条目将仅使用大约400K的内存。
预计到达时间:
为避免存储类别名称,请对名称进行哈希处理并存储哈希。对于128位的MD5散列,每个散列需要16个字节,或者说只有1.6MB的内存+开销。
发布于 2009-05-15 16:03:00
一个想法是在表上添加一个约束,这样数据库就会拒绝重复的插入。然后继续插入所有记录,并让数据库进行检查。
发布于 2009-05-15 16:24:52
假设您的类别名称平均为30字节,那么您只需要30 * 500000字节= 15000000字节= 15000‘d=1.5MB。
我想你有这么大的记忆力。
https://stackoverflow.com/questions/869502
复制相似问题