【问题标题】:How can I store a huge amount of content from multidiemsional array into mysql database?如何将大量内容从多维数组存储到 mysql 数据库中?
【发布时间】:2018-10-30 20:47:14
【问题描述】:

这是我的数组:

array(4) {
  [0]=>
  array(500000) {
    ["1234"]=>
    array(3) {
      ["fileName"]=>
      string(10) "monkey.jpg"
      ["path"]=>
      string(20) "animales/monkey.jpg"
      ["dateTime"]=>
       string(19) "2016-10-12 19:46:25"
    }
    ["3456"]=>
    array(3) {
      ["fileName"]=>
      string(9) "horse.jpg"
      ["path"]=>
      string(19) "animales/horse.jpg"
      ["dateTime"]=>
       string(19) "2016-10-12 19:46:25"
    }
    .... and many more...
  }
 ... and many more...
}

我想将内容存储到我的数据库中:

$sql = "INSERT INTO files (id,fileName,path,dateTime) values(?,?,?,?) ";

foreach($array as $key => $value){
    if(is_array($value)){
        foreach($value as $key => $v){
            foreach($v as $k => $item){
                if(is_array($v)){
                    $s = str_replace("\\","",$v['dateTime']);
                    $d = strtotime($s);
                    $dateTime = date('Y.m.d H:i:s', $d);  
                    $q->execute(array($key,$v['fileName'],$v['path'],$dateTime));
                }
            }
        }
    }
}

我的问题是,我有超过 500.000 个条目。所以我的系统崩溃了。我认为这是因为循环内部有很多循环。有没有办法只用一个循环或其他方式更快地读取内容?

注意:$array 是这样创建的拼接数组 ($array[] = array_splice($orinal_array, 0,count($original_array)); 实际上我这样做是为了让系统更快

【问题讨论】:

  • 注意:你的最后一个 for 循环是多余的。
  • 而不是使用循环插入数据创建数组并一次插入100个数据。所以它会执行得更快,也可以从你的 php.ini 中改变你的执行时间

标签: php mysql loops multidimensional-array foreach


【解决方案1】:

请看一下这个答案:

MYSQL import data from csv using LOAD DATA INFILE

您应该将数据转换为 csv 并依赖 LOAD DATA INFILE

并不是说你应该将 csv 文件上传到你的 mysql 服务器以依赖这个 Mysql 功能

【讨论】:

    【解决方案2】:

    使用serializejson_encode 可能是一种方法。这样,您就不必遍历所有元素并处理斜线,因为所有元素都变成了一个字符串,以后可以使用 json_decode 或反序列化 PHP 函数来读取。

    旁注:请使用有意义的变量名,以便帮助您的人不必弄清楚您的意思。即:

    foreach($v as $k => $item){
    

    差一点
    foreach($fileCollection as $fileIterator => $fileDetails){
    

    如果您真的需要遍历所有数据并将每个文件属性存储在单独的列中,您只需要 2x foreach(一个用于收集,一个用于每个文件)。

    foreach($globalCollection as $fiveHundredThousandRows){ 
        foreach ($fiveHundredThousandRows as $fileIterator => $fileData){
            $timestamp = strtotime($fileData['dateTime']);
            $q->execute(array($fileIterator,$fileData['fileName'],$fileData['path'],date( 'Y.m.d H:i:s', $timestamp)));
        }
    }
    

    【讨论】:

    • 我用你的代码替换了我的代码。但我只得到一个空白页。还没弄清楚原因
    • $globalCollection[0]:这是我使用数组的地方:$array[0]?
    • 找到了,有什么问题。有日期的东西。
    • 现在将检查它是否适用于大文件并通知您
    • 嗨,它可以工作,但现在我只得到数组的第一个块,键为 0:[0]=> array(500000) {..} 我的其他键 [1]=> array(500000) {..}, [3]=> array(245) {..} 没有插入
    猜你喜欢
    • 2018-02-21
    • 1970-01-01
    • 2011-09-12
    • 2015-09-22
    • 2015-11-24
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    相关资源
    最近更新 更多