Как я могу хранить огромное количество контента из многопоточного массива в базе данных MySQL? - PullRequest
0 голосов
/ 21 мая 2018

Это мой массив:

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)); я действительно сделал это, чтобы сделать систему быстрее

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Пожалуйста, посмотрите на этот ответ:

MYSQL импортирует данные из csv с помощью LOAD DATA INFILE

Вы должны конвертировать свои данные в csv и полагаться на LOAD DATAINFILE

Не то чтобы вы загружали на свой сервер MySQL файл CSV, чтобы полагаться на эту функциональность Mysql

0 голосов
/ 21 мая 2018

Использование serialize или json_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)));
    }
}
...