我正在用PHP开发一个应用程序,我需要实现一个大文件处理程序。 读取和写入文件不是问题,但检查文件内容是个问题。
我构建了一个递归函数,用于检查变量是否已在同一文档中使用。
private function val_id($id){
if(!isset($this->id)){
$this->id = array();
}
if(in_array($id, $this->id)){
return $this->val_id($id+1);
}else{
$this->id[] = $id;
return $id;
}
}
当in_array($ id,$ this-> id)返回FALSE时,$ id将被添加到$ this-> id(包含所有使用过的ID的数组)并返回有效ID。
当它返回TRUE时,它返回与参数$ id + 1
相同的函数由于我们一次谈论超过300000条记录,PHP将无法存储这样大的数组。当这个数组太大时,它似乎放弃了我生成的文档中的写行。但我没有收到任何类似的错误消息。
由于生成的文档是具有多行INSERT的SQL文件,因此另一种解决方案可能是检查数据库中是否已存在该ID。 MySQL可以捕获这些异常并再次尝试这些条目,并添加1到id吗?怎么样?
您认为我需要如何解决这个问题?
亲切的问候,
的Wouter
答案 0 :(得分:1)
memory_limit
isset($array[$this->id])
代替in_array()
答案 1 :(得分:1)
使用INSERT IGNORE禁用mysql中的重复密钥检查并删除php中的密钥检查。你的陈述可能是这样的。
INSERT IGNORE INTO tbl_name SET key1 = 1, col1 = 'value1'
如果您想在ID中添加1,则可以使用ON DUPLICATE KEY将密钥增加1:
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
答案 2 :(得分:0)
为什么有30.000条记录成为问题?标准PHP数组中的每个记录占用144个字节,而30.000则意味着4218,75 kByte。没什么大不了的。
否则,你的Common Sense对数组键的想法值得一提,因为它更快。