1

我正在用 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 来再次尝试这些条目吗?如何?

你认为我需要如何解决这个问题?

亲切的问候,

沃特

4

3 回答 3

1
  1. 使错误消息出现。
  2. 增加memory_limit
  3. 而不是值将参数存储在键中-因此您可以使用isset($array[$this->id])而不是in_array()
于 2013-01-15T15:19:18.100 回答
1

使用INSERT IGNORE禁用 mysql 中的重复键检查并删除 php 中的键检查。你的陈述可能看起来像这样。

INSERT IGNORE INTO tbl_name SET key1 = 1, col1 = 'value1'

如果您想始终将 1 添加到 id,您可以使用ON DUPLICATE KEY将您的密钥加一:

INSERT INTO table (a,b,c) VALUES (1,2,3)
    ON DUPLICATE KEY UPDATE c=c+1;
于 2013-01-15T15:20:33.117 回答
0

为什么 30.000 条记录会成为问题?标准 PHP 数组中的每条记录占用 144 个字节,对于 30.000,这意味着 4218,75 kByte。没什么大不了的。

否则,您的常识使用数组键的想法值得考虑,因为它更快。

于 2013-01-15T15:27:11.157 回答