如何解决PHP或使用MySQL中的“数组溢出”问题?

3
在提问之前,请先阅读如何使用php获取唯一的单词对(字符串)并插入到mysql表中
例如: 如果我们有dog cat这样的一对,我们就看不到cat dog
根据@pala_的建议,以下是我的代码。
 $sql= "INSERT INTO EM (source,target) VALUES ";

$res = array();
foreach($combine_words_array as $v1) {
  foreach($combine_words_array as $v2) {
    $t = array($v1, $v2);
    asort($t);
    if(!in_array($t, $res)){
      $res[] = $t;
      $sql.="('$t[0]','$t[1]'),";
     mysql_query(substr($sql,0,-1));    
  }
  }
}

当出现问题时,这个数组必须非常巨大,而MySQL插入会停止在540000行,是否有任何想法可以使用动态数组或与MySQL代码一起使用?

数组中的元素是否唯一?即不会有两个“dog”条目吗?另外,您确定要在PHP中执行此操作吗?数据最初来自哪里?如果数组来自MYSQL,则使用它会更快。 - cr0atIAN
如果所有的MySQL都很容易,但现在数据非常大,应该在PHP中进行压缩或其他处理。 - yihang hwang
1个回答

2

我认为你应该将这个逻辑保留在SQL中,具体如下:

SELECT t1.column AS source, t2.column AS target FROM input_table t1
INNER JOIN input_table t2 ON t1.column < t2.column

那样可以给您所有的唯一配对,并且比在PHP中使用in_array测试获取唯一配对更快。如果数据已经在PHP中而不是在MySQL中,您可以将其每次插入540000行到一个临时表中,然后运行类似上面的内容来获取您感兴趣的配对。数据库是用于集合操作的,而PHP则不是。
如果您坚持以您正在进行的方式构建数组并将其全部保存在PHP内存中,则只有在达到行限制或结束外部循环时才应运行mysql_query(substr($sql,0,-1));行。此时您可以将您的$sql字符串重置为 $sql="INSERT INTO EM (source,target) VALUES"; 并从现在开始构建剩余部分。反复洗涤,直到完成或PHP进程耗尽内存 =)

实际上,需要插入的行数必须是379200 * 379200,这么大啊,我发现停在54000行的原因是php.ini中的memory_limit设置。如果我需要插入并使用MySQL或在php编码后解决,那真的需要一个大硬盘或内存... - yihang hwang
很抱歉,如果不了解你使用PHP需要这么多内存数据的目的和原因,我无法再提供更多建议,希望我能帮到你。 - cr0atIAN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接