如何处理大数组?

时间:2013-01-15 15:15:23

标签: php arrays insert recursive-datastructures

我正在用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

3 个答案:

答案 0 :(得分:1)

  1. 显示错误消息。
  2. 增加memory_limit
  3. 而不是值将参数存储在密钥中 - 这样您就可以使用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对数组键的想法值得一提,因为它更快。