首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存/优化问题

内存/优化问题
EN

Stack Overflow用户
提问于 2009-05-15 15:55:43
回答 3查看 345关注 0票数 1

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

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

所以我有两个选择:

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

代码语言:javascript
复制
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+条目:

代码语言:javascript
复制
SELECT id FROM categories WHERE procId='$procId' AND category='$category'

这里的缺点是,将为每个500,000+记录运行此查询。然而,在一个数组中保存所有类别的缺点是,我可能会耗尽内存,或者服务器可能会崩溃。

有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-05-15 16:00:52

你能不能只保留一个你已经插入的ids列表?如果它们是整数If,即每次4字节乘以100,000个条目将仅使用大约400K的内存。

预计到达时间:

为避免存储类别名称,请对名称进行哈希处理并存储哈希。对于128位的MD5散列,每个散列需要16个字节,或者说只有1.6MB的内存+开销。

票数 2
EN

Stack Overflow用户

发布于 2009-05-15 16:03:00

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

票数 1
EN

Stack Overflow用户

发布于 2009-05-15 16:24:52

假设您的类别名称平均为30字节,那么您只需要30 * 500000字节= 15000000字节= 15000‘d=1.5MB。

我想你有这么大的记忆力。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/869502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档